web-dev-qa-db-fra.com

Comment sélectionner plusieurs nœuds à différents niveaux?

Avoir ce XML (simplifié):

<?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>

Comment sélectionner le nom et les coordonnées de chaque repère? À l'heure actuelle, je peux sélectionner leur nom avec l'expression XPath suivante:

//Document//Placemark//name

Comment puis-je sélectionner les deux sans autres données?

Vous pouvez utiliser une union dans votre expression XPath. Il suffit d'utiliser l'opérateur: |

//Document/Placemark/name | //Document/Placemark/Polygon/coordinates

N'utilisez pas le // ( descendant axis) si vous n'en avez pas besoin. Avec //, cela fonctionnerait aussi: //name | //coordinates. Il est préférable, en termes de performances, de spécifier le chemin exact.

38
toniedzwiedz

Utilisation :

/*/*/Placemark/name | /*/*/Placemark/*/coordinates

Ceci spécifie l'union union des résultats de deux expressions XPath distinctes - l'opérateur d'union XPath standard | est utilisé. Sont sélectionnés tous les éléments name qui sont les enfants d'un élément Placemark qui est un petit-enfant de l'élément supérieur du document XML, plus all coordinates qui sont les petits-enfants d'un élément Placemark qui est un petit-enfant du élément supérieur du document XML.

Les éléments sélectionnés sont classés par ordre de document (bien qu'aucun document normatif du W3C ne spécifie cet ordre), ce qui signifie que dans le résultat de l'évaluation (généralement de type XmlNodeList), tout élément name est directement suivi de l'élément coordinates correspondant.

5
Dimitre Novatchev

Résolu: // Placemark/* [self :: nom ou descendant :: coordonnées]

0
luis long