Comment créer un attribut xmlns:xsd) à nœud XML en Java?
Je suis en train de créer un document XML en Java. Le document doit avoir la structure suivante:
<?xml version="1.0" ?>
<Cancelacion xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
RfcEmisor="VSI850514HX4"
Fecha="2011-11-23T17:25:06"
xmlns="http://cancelacfd.sat.gob.mx">
<Folios>
<UUID>BD6CA3B1-E565-4985-88A9-694A6DD48448</UUID>
</Folios>
</Cancelacion>
Je veux savoir si il y a un moyen de créer les attributs de la forme xmlns:xsd?
Je suis actuellement en déclarant cet attribut comme ceci:
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder;
docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.newDocument();
doc.setXmlVersion("1.0");
doc.setXmlStandalone(true);
Element cancelacion = doc.createElement("Cancelacion");
cancelacion.setAttribute("xmlns", "http://cancelacfd.sat.gob.mx");
cancelacion.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
cancelacion.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
cancelacion.setAttribute("RfcEmisor", rfc);
cancelacion.setAttribute("Fecha", fecha);
Vous devez vous connecter pour publier un commentaire.
La solution de mon problème est d'écrire le code comme suit:
Pourquoi le document de votre structure proposée? Vous êtes à la déclaration d'espaces de nommage avec des préfixes, mais votre exemple de sortie ne comprend pas les éléments dans les espaces de noms. Ces déclarations sont donc inutiles.
Tout d'abord, comprendre que
xmlns
(ouxmlns:prefix
) est le XML réservés pseudo-attribut pour la déclaration des espaces de noms. Ce n'est pas normal attribut. Deuxièmement, l'emplacement des déclarations d'espace de noms dans le document ne te concerne pas, aussi longtemps que vous êtes en train de créer des éléments dans les espaces de noms dans la première place.Laisser le sérialiseur de décider où placer les déclarations d'espace de noms.
Enregistrer un élément dans l'espace de noms correct comme ceci:
Quand sérialisé:
Résultat:
Avis que
Cancelacion
etSomeChild
ont été créés exactement de la même manière, mais seulementCancelacion
contient la déclaration d'espace de noms (parce que la déclaration est valable pour tous les descendants). Le sérialiseur manipulés pour nous.Avertissement: Ce qui suit est un hack. Je ne recommande pas de l'utiliser. Il sera probablement que vous obtenez en difficulté. Vous devriez probablement arrêter de lire. Mais...si vous n'avez pas le choix, il pourrait fonctionner.
Si vous êtes désespéré, vous pouvez manuellement épissure dans les espaces de noms inutilisés. (Le traitement de XML comme une chaîne de caractères est presque toujours une mauvaise idée.)
Tout d'abord, enregistrer le résultat dans un
OutputStream
qui peuvent être convertis à unString
:Puis de la confiture les déclarations d'espace de noms il y a sans aucun égard pour ce qui est bon, juste et décent:
Cancelacion
dans l'espace de noms par défaut. Peut-être que c'est suffisant? Ceux d'une autre déclaration ne semble pas être nécessaire.xmlns:xsd
n'est pas un attribut, c'est un déclaration d'espace de noms.Les DOM doivent créer ces déclarations et quand ils sont nécessaires.
À l'aide de la createElementNS et createAttributeNS méthodes de résultat dans les déclarations d'espace de noms en cours de création, mais vous devez comprendre Les espaces de noms XML.
Dans votre exemple, les espaces de noms liés à xsd et xsi ne sont pas utilisés sont donc superflus. Cependant, la
Cancelacion
élément est dans l'espace de noms par défaut qui est définie par lexmlns="http://cancelacfd.sat.gob.mx"
déclaration dans le fichier XML que vous avez fournis.De sorte que vous devez utiliser:
de le créer. Notez que le préfixe d'espace de noms (ou son absence) est sans incidence sur le sens du document est concerné.
dans mon code, j'ai écrit :
de sortie :