2010-12-14 7 views
75

Mon but est d'extraire certains nœuds de plusieurs fichiers XML avec plusieurs espaces de noms en utilisant XPath. Tout fonctionne bien tant que je connais les URI de l'espace de noms. Le nom d'espace de nom lui-même reste constant, mais les schémas (XSD) sont parfois générés par le client, c'est-à-dire inconnus. Puis je suis parti avec essentiellement trois choix:
comment ignorer les espaces de noms avec XPath

  1. utiliser un seul schéma pour l'espace de noms, rien dans l'espoir va mal (? Puis-je être sûr)

  2. obtenir les nœuds enfants du document et Recherchez le premier nœud avec un URI d'espace de noms, en espérant qu'il est là et utilisez simplement l'URI, en espérant que c'est le bon. peut mal tourner pour de multiples raisons

  3. en quelque sorte dire XPath: « regardez, je ne se soucient des espaces de noms, juste trouver tous les nœuds avec ce nom, je peux même vous dire le nom de l'espace de noms, mais pas l'URI » . Telle est la question ici ...

Ce n'est pas une réitération de nombreuses questions « mon expression XPath ne fonctionne pas parce que je ne suis pas au courant de la conscience d'espace de noms » que l'on trouve here ou here. Je sais comment utiliser la conscience de l'espace de noms. Juste pas comment s'en débarrasser.

+2

Si vous ne connaissez pas les schémas, comment savez-vous quels éléments vous voulez? –

+3

Exact duplicate of [Comment ignorer l'espace de noms lors de l'analyse du document XML avec XPath] (http://stackoverflow.com/questions/4402310/how-to-ignore-namespace-when-parsing-xml-document-with-xpath) –

+0

Merci de m'avoir signalé, Alejandro. La recherche de "ignore namespace xpath" aurait dû révéler celui-ci, mais il n'a pas – kostja

Répondre

113

Vous pouvez utiliser la fonction XPath local-name(). Au lieu de sélectionner un noeud comme

/path/to/x:somenode 

vous pouvez sélectionner tous les noeuds et le filtre pour celui avec le nom local correct:

/path/to/*[local-name() = 'somenode'] 
+6

Vous pouvez également utiliser le 'nom-local()' pour faire référence aux attributs, de manière non-nominative, voir: http://stackoverflow.com/q/21239181/274677 –

+0

Jetez un oeil à ce tutoriel: http://www.codesimplify.com/java/java-xpath-ignore-namespace-example/ – hipokito

9

Vous pouvez faire la même chose dans XPath2.0 dans un moins syntaxe verbeuse:

/path/to/*:somenode 
Questions connexes