Как выбрать несколько узлов на разных уровнях?

Наличие этого (упрощенного) 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]