XML XPath вопрос - PullRequest
       3

XML XPath вопрос

1 голос
/ 21 марта 2011
 <categories>
<member>
    <name> Ants </name>
    <size> 8 </size>
    <submember>
        <structure>
            <name>Acrobat Ants </name>
            <size>Slightly over 1/8" </size>
            <color>Tan, red with heart shaped abdomen </color>
            <habitat>Inside moist wood</habitat>
            <found>Throughout the US</found>
            <desc></desc>
            <productLink> </productLink>
        </structure>

        <structure>
            <name>Argentine Ant </name>
            <size>About 1/16" </size>
            <color>Light to dark brown </color>
            <habitat>Shallow areas with moist soil</habitat>
            <origin>Argentina and Brazil</origin>
            <desc></desc>
            <productLink></productLink>
        </structure>    

        <structure>
            <name>Carpenter Ants </name>
            <size>1/4-1/2" </size>
            <color>Varies</color>
            <Habitat>Inside decayed or moist wood</Habitat>
            <Found>Throughout the US</Found>
            <desc>C</desc>
            <productLink></productLink>
        </structure>
     </submember>
 </member>
 </categories>

Скажем, у меня есть такой XML-файл (фактический xml намного длиннее этого), тогда как мне получить структуру "Ants" с помощью xpath?

Ответы [ 3 ]

4 голосов
/ 21 марта 2011

Я предполагаю, что вы хотите member, который содержит Ants в качестве Name.Этого должно быть достаточно:

/categories/member[name=' Ants ']

Обратите внимание, что в кавычках указан пробел, необходимый для имени.Пробелы важны в XML, поэтому пробелы вокруг Ants также являются частью контента.В противном случае вы можете сначала нормализовать пробелы, которые эффективно обрезают лишние пробелы, прежде чем сравнивать.

/categories/member[normalize-space(name)='Ants']

Как указывает Алехандро, вы можете захотеть иметь потомков structure под элементом Ants.Тогда вам нужно копать немного дальше.

/categories/member[normalize-space(name)='Ants']/submember/structure
1 голос
/ 21 марта 2011

Допустим, у меня есть такой XML-файл (фактический XML намного длиннее, чем это) тогда как мне достать "муравьев" структура с использованием xpath?

Я предполагаю, что вы хотите выбрать любой structure с дочерним элементом name, строковое значение которого содержит строку "Муравьи".

Используйте :

  /*/*/*/structure[contains(name, 'Ants')]

Выбирает любой элемент structure, у которого есть дочерний элемент name, который содержит строку «Ants», и который (элемент sructure) является дочерним элементом любого элемента, который является дочерним элементом любого элемента, который является дочерним. верхнего элемента XML-документа.

Или используйте :

  /*/*/*/structure[contains(concat(name,' '), ' Ants ')]

При этом выбирается элемент structure, который удовлетворяет всем требованиям, как в предыдущем выражении, за исключением того, что его дочерний элемент name должен содержать «муравьи», перед которыми стоит пробел, а затем либо пробел, либо конечная подстрока полное строковое значение name.

0 голосов
/ 21 марта 2011

Вот несколько расширений @ хорошего ответа Джеффа. Это предназначается для всех <structure> элементов ниже <member>, чье имя содержит Ants (учитывая начальные / конечные пробелы):

/categories/member[normalize-space(name)='Ants']/submember/structure

Или только первый:

/categories/member[normalize-space(name)='Ants']/submember/structure[1]

Просто Carpenter Ants:

/categories/member[normalize-space(name)='Ants']/submember/structure[normalize-space(name)='Carpenter Ants']

И так далее ...

Вы должны попытаться обобщить их для своего собственного использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...