Запросите документ 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,

Другие вопросы по тегам