xmlstarlet: выбор элемента по номеру позиции

У меня есть этот файл XML

<?xml version="1.0" encoding="utf-8"?>
<xObject version="3.0" xmlns="http://schemas.microsoft.com/random/2006/objects">
    <section id="*" type="product">
        <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>
    </section>
</xObject>

Что я хочу сделать, это выбрать каждый 4-й элемент с xmlstarlet.

Мне удалось сделать это с помощью XmlPad следующим образом: //table[@name='XFile']/row/field[4]/text(), но, к сожалению, я должен сделать это с помощью xmlstarlet.

Кроме того, если я удаляю атрибуты / пространство имен xObject, похоже, работает с помощью команды: xml sel -t -v "//table/row/field[4]/text()" test.xml

У кого-нибудь есть идеи, как это можно сделать? Я впервые пытаюсь оценить xpath.

С уважением, Стефан

1 ответ

Решение

Вы должны определить пространство имен и использовать его в своем выражении XPath:

$ xmlstarlet sel -N ns="http://schemas.microsoft.com/random/2006/objects" -t -v "//ns:table/ns:row/ns:field[4]/text()" test.xml

Команда выше использует -N ns="http://schemas.microsoft.com/random/2006/objects" объявить пространство имен с именем ns это значение в пространстве имен по умолчанию в вашем XML-файле. Тогда выражение XPath устанавливается так, чтобы это ns префикс используется.

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