NamespaceContext et l'utilisation des espaces de noms avec XPath
De la résolution d'un xpath qui comprend des espaces de nommage en Java semble nécessiter l'utilisation d'un NamespaceContext
objet, de la cartographie des préfixes d'espace de noms d'url et vice versa. Cependant, je ne trouve pas de mécanisme pour obtenir un NamespaceContext
autre que la mise en œuvre moi-même. Cela semble contre-intuitif.
La question: Est il un moyen facile d'acquérir un NamespaceContext
à partir d'un document, ou d'en créer un, ou, à défaut, à renoncer à la préfixes complètement et spécifier l'expression xpath, avec des noms pleinement qualifiés?
Il y a quelques base missundertood de votre question: vous pouvez obtenir tous les espaces de noms URI à partir d'un XML avec XPath (il y a des réponses pour cela en faire), mais vous ne pouvez pas simple de remplir un préfixe d'espace de noms URI de liaison de la classe parce que pour chaque nœud il peut être différent lié. Lors de la sélection des nœuds, vous devriez savoir à l'avance les noms de vos éléments souhaités et qui comprend leur espace de noms URI
OriginalL'auteur Jherico | 2009-05-27
Vous devez vous connecter pour publier un commentaire.
Il est possible d'obtenir un NamespaceContext instance sans écrire votre propre classe. Son classe-utilisation page vous pouvez en obtenir un en utilisant le javax.xml.flux paquet.
De renoncer à des préfixes, est susceptible de conduire à des expressions ambiguës - si vous souhaitez déposer préfixes d'espace de noms, vous aurez besoin de changer le format du document. La création d'un contexte à partir d'un document n'a pas forcément de sens. Les préfixes doivent correspondre à ceux utilisés dans l'expression XPath, ne sont pas ceux de tout document, comme dans ce code:
Ni la mise en œuvre retourné par l'API StAX ni l'un au-dessus de mettre en œuvre toute la classe/méthode contrats tels que définis dans la doc. Vous pouvez en obtenir un, la carte basée sur la mise en œuvre ici.
Oui, c'est un peu de douleur qu'il n'y ait pas de défaut de mise en œuvre.
Je pense que c'est stupide. Combien d'autres interfaces de java qui sont utilisés dans les Api publiques ont pas publiquement disponibles des implémentations concrètes ou des usines?
OriginalL'auteur McDowell
Je viens de travailler grâce à l'aide de xpath et NamespaceContexts moi-même. Je suis tombé sur un bon traitement de la question sur developerworks.
OriginalL'auteur Suppressingfire
J'ai trouvé une pratique mise en œuvre dans "Apache WebServices Utilitaires" appelé NamespaceContextImpl.
Vous pouvez utiliser la dépendance maven pour obtenir cette classe:
J'ai utiliser de la manière suivante (je sais que je suis construit pour sax, mais après la lecture du code, de son de l'o.k):
Vous n'avez pas besoin de appelé endPrefixMapping.
Exactement ce que je cherchais. La javadoc: ws.apache.org/commons/util/apidocs/index.html
Meitham - je n'ai pas tout chemin qui évite de coder en dur le nom de l'espace. Vous êtes d'amorçage de la recherche XPath par la création de cet espace de noms contexte, l'initialisation par le mappage d'un court préfixe à chaque espace de noms vous savez contenues dans le document, puis lors de la recherche par XPath utilisation de ces préfixes lors de la définition du chemin d'accès.
OriginalL'auteur Asaf Mesika
Si vous utilisez le framework Spring vous pouvez réutiliser leurs NamespaceContext mise en œuvre
org.springframework.util.xml.SimpleNamespaceContext
C'est une semblable réponse comme celle de Asaf Mesika. Afin de ne pas vous donner automatique d'un NamespaceContext basé sur votre document. Vous devez construire vous-même. Encore qu'il vous aide à vous car au moins vous donne une mise en œuvre commence par.
Lorsque nous sommes confrontés à un problème similaire, à la Fois le printemps
SimpleNamespaceContext
et de la "Apache WebServices Utilitaires" travaillé. Nous voulions éviter le plus pot de dépendance sur Apache WebServices Utilitaires et utilisé le Printemps, parce que notre application est du Ressort en fonction.OriginalL'auteur bartolom
Si vous utilisez Maillot 2 et n'ont qu'un défaut d'espace de noms XML (
xmlns="..."
), vous pouvez utiliser SimpleNamespaceResolver:Vous pouvez également spécifier
xmlns
manuellement si vous le souhaitez.OriginalL'auteur Ben Hutchison