Как выбрать несколько узлов на разных уровнях?
Наличие этого (упрощенного) XML:
<?xml version="1.0" encoding="UTF-8"?>
<kml>
<Document>
<Placemark>
<name>Poly 1</name>
<Polygon>
<coordinates>
-58.40844625779582,-34.60295278618136,0
</coordinates>
</Polygon>
</Placemark>
<Placemark>
<name>Poly 2</name>
<Polygon>
<coordinates>
-58.40414334150432,-34.59992445476809,0
</coordinates>
</Polygon>
</Placemark>
</Document>
</kml>
Как я могу выбрать имя и координаты каждой метки?
Прямо сейчас я могу выбрать их имя со следующим выражением XPath:
//Document//Placemark//name
Как я могу выбрать оба без каких-либо других данных?
Ответы
Ответ 1
Вы можете использовать объединение в выражении XPath. Просто используйте оператор: |
//Document/Placemark/name | //Document/Placemark/Polygon/coordinates
Не используйте //
(ось потомка), если вам это не нужно. Используя //
, это также сработает: //name | //coordinates
. Лучше всего определить точный путь.
Ответ 2
Использование
/*/*/Placemark/name | /*/*/Placemark/*/coordinates
Указывает объединение результатов двух отдельных выражений XPath - используется стандартный оператор объединения XPath |
. Выбраны все элементы name
, которые являются дочерними элементами элемента Placemark
, который является внуком верхнего элемента XML-документа, плюс все элементы coordinates
, которые являются grand-children элемента Placemark
, который является внуком верхнего элемента XML-документа.
Выбранные элементы входят в порядок документа (хотя нормативный документ W3C не определяет порядок), что означает, что в результате оценки (обычно типа XmlNodeList) любой элемент name
непосредственно следует за его соответствующим coordinates
элемент.
Ответ 3
Решено://Плей-марк/* [self:: name или descendant:: maps]