2015-07-13 2 views
0

Принимая это XML-фрагмент в качестве примера:содержит в XPath проверяет только первый матч

<list> 
    <element> 
    <title>Element 1</title> 
    <group>Group 1</group> 
    </element> 
    <element> 
    <title>Element 2</title> 
    <group>Group 1</group> 
    </element> 
    <element> 
    <title>Element 3</title> 
    <group>Group 1</group> 
    <group>Group 2</group> 
    </element> 
    <element> 
    <title>Element 4</title> 
    <group>Group 2</group> 
    <group>Group 3</group> 
    </element> 
</list> 

Чтобы получить все группы, которые я использую следующее: XPath

//group/text() 

и работает отлично -I удалить дубликаты позже в python, используя набор, поскольку я не знаю, могу ли я сделать это с помощью xpath. Но когда я хочу, чтобы получить элементы, которые содержат «Группа 3» Я стараюсь следующий XPath:

//element[contains(group/text(), "Group 3")] 

и я получаю пустой результат. Хотя при поиске элементов, которые содержат «Группу 1», с:

//element[contains(group/text(), "Group 1")] 

Я получаю правильный результат с 3 элементами. И если я ищу «группу 2», я получаю неправильный результат только с одним элементом.

Что я не принимаю во внимание? Как я могу выполнить поиск по группе?

ответ

0

contains может тестировать только, если строка встречается в другой строке. group/text() не является строкой, это набор/последовательность узлов.

Вы можете использовать

//element[group/text() = "Group 1"] 
+1

Лучше все еще '// элемент [группа = "Группа 1"]'. Лучше избегать использования 'text()' не только потому, что это обычно не нужно, но также и потому, что это иногда неправильно - например, оно не будет работать, если XML-документ содержит комментарии, смешанные с текстом. –

Смежные вопросы