Il existe quelques techniques que vous pouvez essayer; que vous utiliserez dépendra exactement des informations dont vous avez besoin pour sortir du document, de la rigueur que vous souhaitez obtenir et de la conformité de l'implémentation XPath que vous utilisez. Une façon d'obtenir l'URI de l'espace de noms associé à un préfixe particulier est d'utiliser l'axe namespace::
. Cela vous donnera un nœud d'espace de noms dont le nom est le préfixe et dont la valeur est l'URI de l'espace de noms. Par exemple, vous pouvez obtenir l'espace de nom URI par défaut sur l'élément de document à l'aide du chemin:
/*/namespace::*[name()='']
Vous pourriez être en mesure d'utiliser pour mettre en place les associations d'espace de noms pour votre XPathNavigator. Soyez averti, cependant, que l'axe namespace::
est l'un de ces coins de XPath 1.0 qui n'est pas toujours implémenté. Une deuxième façon d'obtenir cet URI d'espace de noms est d'utiliser la fonction namespace-uri()
sur l'élément de document (que vous avez dit sera toujours dans cet espace de noms). L'expression:
namespace-uri(/*)
vous donnera cet espace de noms. Une alternative serait d'oublier d'associer un préfixe à cet espace de noms, et de rendre votre chemin sans espace de noms. Vous pouvez le faire en utilisant la fonction local-name()
chaque fois que vous avez besoin de faire référence à un élément dont vous ne connaissez pas l'espace de noms.Par exemple:
//*[local-name() = 'Element']
Vous pouvez aller un peu plus loin et tester l'URI d'espace de nom de l'élément contre celui de l'élément de document, si vous vouliez vraiment:
//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]
Une dernière option, étant donné que l'espace de noms semble ne rien vouloir dire, serait d'exécuter votre XML à travers un filtre qui supprime les espaces de noms. Alors vous ne devrez pas vous inquiéter à leur sujet dans votre XPath du tout. La façon la plus simple de le faire serait simplement de supprimer l'attribut xmlns
avec une expression régulière, mais vous pourriez faire quelque chose de plus complexe si vous deviez faire d'autres choses en même temps.
ou avez-vous déjà: xmlns: myns = "namespace-uri" Aussi lisez-vous les fichiers dans leur intégralité dans un document DOM ou parser en utilisant quelque chose comme XmlValidatingReader? – Kev
Ils sont toujours dans l'espace de noms par défaut. Je ne lis pas encore complètement le fichier, car je suis resté coincé dans cette affaire; Je suppose que je ne comprends pas complètement lorsque vous demandez "dans un document DOM ou analyser en utilisant quelque chose comme le XmlValidatingReader"; J'utiliserais XPath seulement pour lire le XML, est-ce mauvais? –