Dans le deuxième exemple de fichier XML les éléments sont liés à un espace de noms. Votre XPath est de tenter de traiter les éléments qui sont liés à la valeur par défaut "aucun espace de noms" espace de noms, de sorte qu'ils ne correspondent pas.
La méthode préférée consiste à enregistrer l'espace de noms avec un espace de noms de préfixe. Il rend votre XPath beaucoup plus facile à développer, à lire et à maintenir.
Cependant, il n'est pas obligatoire de vous inscrire à l'espace de noms et d'utiliser l'espace de noms de préfixe dans votre XPath.
Vous pouvez formuler une expression XPath qui utilise un générique de match pour un élément et d'un prédicat de filtre qui limite le match pour l' local-name()
et de la namespace-uri()
. Par exemple:
/*[local-name()='workbook'
and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']
/*[local-name()='sheets'
and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']
/*[local-name()='sheet'
and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main'][1]
Comme vous pouvez le voir, il produit une très longue et prolixe instruction XPath qui est très difficile à lire (et de maintenir).
Vous pourriez tout aussi bien correspondre à l' local-name()
de l'élément et d'ignorer l'espace de noms. Par exemple:
/*[local-name()='workbook']/*[local-name()='sheets']/*[local-name()='sheet'][1]
Cependant, vous courez le risque de contrepartie, le mauvais éléments. Si votre XML a des vocabulaires (qui peut ne pas être un problème pour cet exemple) qui utilisent le même local-name()
, votre XPath peut correspondre à du mauvais éléments et sélectionnez le mauvais contenu: