Nettoyer l'espace de noms de la manipulation avec dom4j
Nous sommes à l'aide de dom4j 1.6.1, à analyser le XML venir de quelque part. Parfois, la balise la mention de l'espace de noms ( par exemple : ) et parfois non ( ). Et c'est à l'appel de l'Élément.selectSingleNode(String s ) échoue.
Pour l'instant nous avons 3 solutions, et nous ne sommes pas heureux avec eux
1 - Supprimer tous les noms occurence avant de faire quoi que ce soit avec le document xml
xml = xml .replaceAll("xmlns=\"[^\"]*\"","");
xml = xml .replaceAll("ds:","");
xml = xml .replaceAll("etm:","");
[...] //and so on for each kind of namespace
2 - Supprimer de l'espace de noms, juste avant l'obtention d'un nœud
En appelant
Element.remove(Namespace ns)
Mais il ne fonctionne que pour un nœud et le premier niveau de l'enfant
3 - l'Encombrement du code par
node = rootElement.selectSingleNode(NameWithoutNameSpace)
if ( node == null )
node = rootElement.selectSingleNode(NameWithNameSpace)
Alors ... qu'en pensez-vous ? La sorcière est le moins pire ? Avez-vous une autre solution à proposer ?
OriginalL'auteur Antoine Claval | 2009-09-14
Vous devez vous connecter pour publier un commentaire.
J'ai voulu supprimer toutes les informations d'espace de noms(déclaration et tag) afin de faciliter l'expression xpath de l'évaluation. Je me retrouve avec cette solution :
où la NameSpaceCleaner est un dom4j visiteur :
Fonctionne parfaitement pour moi!
Attention. Si vous allez sur le code source de lecture.read(), vous trouverez qu'il va analyser le contenu du fichier xml avec namesapce conscient paramètre à true (codé en dur dom4j 1.6).
OriginalL'auteur mestachs
Voici un code que j'avais trouvé et maintenant l'utiliser. Peut être utile, si vous cherchez une façon générique, pour supprimer tous les espaces de noms à partir d'un dom4j document.
Espère que cela est utile pour quelqu'un qui en a besoin!
Salut Dan, Ce n'supprimer les espaces de noms à partir du document. Probablement vous êtes intéressé par la suppression des préfixes.
Désolé, Par erreur, j'ai sauvé avant de terminer ce que je voulais écrire! Dan, Cette fonction supprime les espaces de noms à partir du document. J'ai essayé ce w/ 5ème exemple de la w3schools. Vous pouvez le vérifier en créant un xpath comme "//de la table". Exécuter cette xpath sur le document avant et après l'appel de la removeNamespaces de la fonction, et vous verrez que ce dernier se trouvent les nœuds pour vous. Qu'est-ce exactement que vous essayez de faire ? Je doute si vous vous intéressez plus juste de retirer le prefixs, pour l'e.g (h:table -> table) ? Laissez-moi savoir si je peux être d'une aide quelconque!
OriginalL'auteur Abhishek
L'Option 1 est dangereux parce que vous ne pouvez pas garantir les préfixes pour un espace de noms donné sans pré-analyse du document, et parce que vous pouvez vous retrouver avec de l'espace de noms de collision. Si vous êtes de la consommation d'un document et pas pour la sortie rien, il peut être ok, en fonction de la source de la doc, mais sinon, il perd beaucoup trop d'informations.
Option 2 pourrait être appliquée de manière récursive, mais son obtenu un grand nombre des mêmes problèmes que pour l'option 1.
Option 3 sons comme la meilleure approche, mais plutôt que d'encombrer votre code, de créer une méthode statique qui ne les chèques plutôt que de mettre le même si l'instruction tout au long de votre base de code.
La meilleure approche est d'obtenir celui qui vous envoie le mauvais XML pour le fixer. Bien sûr, cela pose la question est-elle cassée. Plus précisément, êtes-vous d'obtenir XML où l'espace de noms par défaut est définie comme X et ensuite un espace de noms représentant aussi le X est donné un préfixe de "es"? Si c'est le cas, alors le XML est bien formé et vous avez juste besoin d'un code qui est agnostique sur le préfixe, mais utilise encore un nom qualifié pour récupérer l'élément. Je ne suis pas assez familier avec Dom4j de savoir si la création d'un espace de Noms avec une valeur null préfixe fera correspondre à tous les éléments avec un URI ou seulement ceux avec aucun préfixe, mais sa vaut la peine d'expérimenter avec.
OriginalL'auteur Jherico
Comme Abhishek, j'avais besoin de bande de l'espace de noms de XML pour simplifier les requêtes XPath dans un système de scripts de test. (le XML est d'abord XSD validé)
Voici les problèmes que j'ai rencontrés:
document.selectNodes("//*")
J'ai fini avec la suivante (pas la plus élégante, mais si cela peut aider à résoudre les problèmes de quelqu'un ...):
OriginalL'auteur vdr
Ce code fonctionne réellement:
OriginalL'auteur user2368526