L'ajout d'espace de noms déjà créé document XML
Je suis entrain de créer un Document du W3C objet à l'aide d'une Chaîne de valeur. Une fois que j'ai créé l'objet Document, je veux ajouter un espace de noms de l'élément racine du document. Voici mon code actuel:
Document document = builder.parse(new InputSource(new StringReader(xmlString)));
document.getDocumentElement().setAttributeNS("http://com", "xmlns:ns2", "Test");
document.setPrefix("ns2");
TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer aTransformer = tranFactory.newTransformer();
Source src = new DOMSource(document);
Result dest = new StreamResult(new File("c:\\xmlFileName.xml"));
aTransformer.transform(src, dest);
Ce que j'utilise comme entrée:
<product>
<arg0>DDDDDD</arg0>
<arg1>DDDD</arg1>
</product>
Ce que la sortie doit ressembler à:
<ns2:product xmlns:ns2="http://com">
<arg0>DDDDDD</arg0>
<arg1>DDDD</arg1>
</ns2:product>
Je besoin d'ajouter le préfixe de la valeur et de l'espace de noms aussi à l'entrée de la chaîne xml. Si j'ai essayer le code ci-dessus, j'obtiens cette exception:
NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
Remercie de votre aide!
- Est votre
builder
de l'espace de noms courant?builder.isNamespaceAware()
Vous devez vous connecter pour publier un commentaire.
Car il n'y a pas un moyen facile de renommer l'élément racine, nous allons le remplacer par un élément qui a le bon espace de noms et d'attributs, puis copier l'original de tous les enfants en elle. Forcer la déclaration d'espace de noms n'est pas nécessaire, car en donnant à l'élément de l'espace de noms correct (URI) et la mise sur le préfixe, la déclaration sera automatique.
Remplacer le
setAttribute
etsetPrefix
avec cette (ligne 2,3)Dans le code d'origine de l'auteur a essayé de déclarer un élément de l'espace de noms comme ceci:
Le premier paramètre est l'espace de nom de l'attribut, et comme c'est un attribut d'espace de noms, il faut avoir la http://www.w3.org/2000/xmlns/ URI. La déclaration de l'espace de noms doit venir dans le 3e paramètre
replaceChild()
(probablement quelque chose que j'ai fait de mal), mais il semble qu'il est plus facile de renommer un noeud:doc.renameNode(doc.getDocumentElement(), nameSpaceNeeded, doc.getDocumentElement().getTagName());
Soufflet approche fonctionne aussi pour moi, mais probablement ne devrait pas utiliser dans les performances critiques cas.
Partiellement glanées à partir de ici, et également à partir d'un commentaire ci-dessus, j'ai réussi à le faire fonctionner (transformation de l'arbitraire d'un Nœud DOM et l'ajout d'un préfixe à elle et à ses enfants), donc:
Si ça aide quelqu'un. J'ai ensuite convertir en string, puis supprimer manuellement les extra-tête et les lignes de fermeture.