Запросите документ XML с несколькими элементами с одинаковыми именами в bash
Я нашел несколько вопросов, несколько похожих на мои, но я не смог адаптировать их решения.
У меня есть документ XML, где есть несколько элементов с одинаковыми именами. Я не могу предоставить точное содержание документа, но этот вопрос имеет такой же эквивалент:
<table name="XFile">
<row sourceLineNumber="D:\bla\bla\">
<field>Borderish.fo</field>
<field>Documents</field>
<field>1</field>
<field>This line here 1</field>
</row>
<row sourceLineNumber="D:\blah\blah\">
<field>Charterish</field>
<field>Documents</field>
<field>1</field>
<field>This line here 2</field>
</row>
</table>
Мне нужно иметь возможность сделать что-то эквивалентное инструкции SQL SELECT field[3] WHERE field[0] = "Charterish"
,
Если это помогает, мой документ, кажется, имеет схему, определенную ниже, которая отображает каждый <field>
значение имени, например "IP-адрес"; Я еще не нашел никакой информации о том, как использовать это отображение, но я уверен, что есть способ.
До сих пор я пытался решить это с помощью xmlstarlet; Тем не менее, у меня также есть возможность использовать Python, если это будет проще. Пожалуйста, примите во внимание мой уровень в bash / python, а мой уровень в XML чрезвычайно базовый.
1 ответ
Предположим, что у вас есть XML-документ, содержащий эту часть (именно вы должны были предоставить упрощенный, но все еще актуальный XML):
<table name="XFile">
<row sourceLineNumber="D:\bla\bla\">
<field>Borderish.fo</field>
<field>Documents</field>
<field>1</field>
<field>This line here 1</field>
</row>
<row sourceLineNumber="D:\blah\blah\">
<field>Charterish</field>
<field>Documents</field>
<field>1</field>
<field>This line here 2</field>
</row>
</table>
и предположим, что ваш XML не имеет пространства имен по умолчанию, тогда вы можете адаптировать решение, представленное в вопросе, на который вы ссылались, для использования этого XPath:
//row[field[1]='Charterish']/field[4]
Выше XPath - перевод вашего псевдо-SQL-запроса:
SELECT field[3] WHERE field[0] = "Charterish"
Обратите внимание, что индекс позиции XPath начинается с 1
вместо 0
,