Comment puis-je obtenir JDOM/XPath pour ignorer les espaces de noms?
J'ai besoin de traiter un fichier XML DOM, de préférence avec JDOM, où je peux faire XPath de recherche sur les nœuds. Je sais les noms des nœuds ou des chemins, mais je veux ignorer les espaces de noms complètement parce que parfois, le document est livré avec des espaces de noms, parfois sans, et je ne peux pas compter sur des valeurs spécifiques. Est-ce possible? Comment?
Plutôt que de les ignorer, vous pouvez également récupérer et les utiliser. Voir Comment faire pour récupérer des espaces de noms dans des fichiers XML à l'aide de Xpath
OriginalL'auteur AdSR | 2010-04-09
Vous devez vous connecter pour publier un commentaire.
Je sais que cette question est un peu vieux, mais pour ceux qui regardent cette plus tard, vous pouvez remplacer quelques JDOM classes par défaut pour rendre efficacement-il ignorer les espaces de noms. Vous pouvez passer votre propre JDOMFactory mise en œuvre de la SAXBuilder qui ignore toutes les valeurs de l'espace de Noms passés dans celui-ci.
Ensuite remplacer le SAXBuilder de la classe et de mettre en œuvre la createContentHandler méthode afin qu'elle retourne un SAXHandler avec une définition vierge pour la startPrefixMapping méthode.
Je n'ai pas utilisé ce dans un environnement de production afin de caveat emptor, mais j'ai vérifié qu'il n'travailler sur certains rapide et sale XML trucs que j'ai fait.
OriginalL'auteur jhulford
devient
Vous obtenez le point. Ne vous attendez pas à être rapide comme l'éclair.
Votre question semble impliquer que vous n'avez aucune connaissance de l'espace de noms de l'état de vos documents & ils viennent au hasard. Dans ce cas, le ci-dessus est le plus "sûrs", comme dans: il fonctionnera toujours, mais vous perdre la capacité de faire une différence entre
x:foo
etns:foo
.Merci, cette solution a fonctionné pour moi dans jdom 1.x (/*:foo n'a pas fonctionné).
OriginalL'auteur Tomalak
Ici est un jDOM2 solution a été en cours d'exécution dans un environnement de production pour une année sans trop de mal.
OriginalL'auteur jaco0646
Vous pouvez utiliser
/*:foo
(XPath 2.0 ou supérieur) ou/yournamespace:*
comme expliqué ici.La première variante sélectionne tous les nœuds avec le nom correspondant, indépendamment de ce que l'espace de noms auquel ils appartiennent, y compris avoir aucun espace de noms. Ce dernier sélectionne tous les nœuds appartenant à un espace de noms spécifique, quel que soit le nom de nœud.
NS:*
) est valide XPath 1.0/2.0, mais le premier (*:Name
) n'est valide que XPath 2.0. Sans cette information, votre réponse a moins de valeur...Il est nommé xpath2-intro 😉 Et effectivement la question est posée par la première expression. Mais bien sûr, je l'aurais écrit.
OriginalL'auteur akostadinov