Quand un XMLDOMDocument se sauve, comment puis-je l'obtenir pour inclure la déclaration L'objet XMLDOMDomCument est créé en mémoire (c'est-à-dire que le XML n'est pas chargé de certaines sources extérieures): p> sans la déclaration XML que vous Obtenez le corps XML, par exemple: p> plutôt que le document XML complet: p> Comment puis-je contrôler le encoder le XMLDOMDocument utilisera quand il enregistre un flux? < / p> p>
xml version = "1.0" coding = "utf-8"?> code> li>
xml version = "1.0" coding = "utf-16"?> code> li>
xml version = "1.0" encoding = "UCS-2"?> CODE> LI>
xml version = "1.0" coding = "UCS-4"?> CODE> LI>
xml version = "1.0" coding = "ISO-10646-UCS-2"?> Code> Li>
xml version = "1.0" coding = "Unicode-1-1-utf-8"?> code> li>
xml version = "1.0" coding = "Unicode-2-0-UTF-16"?> code> li>
xml version = "1.0" coding = "Unicode-2-0-UTF-8"?> Code> Li>
xml version = "1.0" coding = "US-ASCII"?> CODE> LI>
xml version = "1.0" coding = "iso-8859-1"?> code> li>
xml version = "1.0" coding = "Windows-1250"?> Code> LI>
ul> question 2 h2>
5 Réponses :
Vous devez utiliser un MXXMLWriter60, au lieu de l'enregistrer directement. Désolé, je n'ai pas d'exemple C #, mais voici l'équivalent VB.NET. Voir imxwriter pour plus de détails.
' Create and load a DOMDocument object.
Dim xmlDoc As New DOMDocument60
xmlDoc.loadXML("<doc><one>test1</one><two>test2</two></doc>")
' Set properties on the XML writer - including BOM, XML declaration and encoding
Dim wrt As New MXXMLWriter60
wrt.byteOrderMark = True
wrt.omitXMLDeclaration = False
wrt.encoding = "US-ASCII"
wrt.indent = True
' Set the XML writer to the SAX content handler.
Dim rdr As New SAXXMLReader60
Set rdr.contentHandler = wrt
Set rdr.dtdHandler = wrt
Set rdr.errorHandler = wrt
rdr.putProperty "http://xml.org/sax/properties/lexical-handler", wrt
rdr.putProperty "http://xml.org/sax/properties/declaration-handler", wrt
' Now pass the DOM through the SAX handler, and it will call the writer
rdr.parse xmlDoc
' Let the writer do its thing
Dim iFileNo As Integer
iFileNo = FreeFile
Open App.Path + "\saved.xml" For Output As #iFileNo
Print #iFileNo, wrt.output
Close #iFileNo
C'est exactement ce dont j'avais besoin. La syntaxe Sortie B> est très étrange cependant.
Cela fonctionne comme indiqué, mais lorsque j'essaie de sortir avec WRT.CODING = "UTF-16", la note d'ordre d'octet n'apparaît pas, donc ce n'est pas "vraiment" utf-16 .... Qu'est-ce que je manque?
Je ne sais pas pourquoi pas, mais essayez de ne pas définir le wrt.encoding code> du tout. La valeur par défaut est de faire UTF-16. Mais aussi, comment avez-vous déterminé que la naissance est manquante? Certains éditeurs et spectateurs le cachent de vous ...
@lavinio apparemment vous avez raison et je n'ai jamais testé ce code. Je viens de confiance b> que spécifiant écrivain.byteordermark = true code> la causerait d'écrire la marque d'ordre d'octet. Aujourd'hui, j'ai remarqué que le bom manquait. J'ai donc vérifié la documentation. Réglage byeordermark code> à False cause la suppression de l'écriture de la naissance. Réglage byeordermark code> à TRUE la cause de suivre la norme XML concernant si la norme doit être incluse. Le Spécification XML ne dit pas si / lorsqu'une chute doit être incluse .
La documentation indique que coding code> est ignoré si la sortie est une chaîne, msdn.microsoft.com/en-us/library/ms756020%28v=vs.85%29.aspx .
voici un même chose en C ++ ... et un explication de ce qui se passe. P> p>
Voici la même chose à Delphi: et une version d'écriture à un flux: p>
Vous devriez être capable d'obtenir la même chose en utilisant la méthode de créationProcessinginstruction.
exemple; p>
En plus de cela, j'ai eu besoin de changer le "" à \ "a-t-il fonctionné comme annoncé, merci d'avoir ajouté la bonne solution.
C ++: car, sérieusement, la solution correcte est une blague ... p> p>
Quelle langue et quelle plate-forme utilisez-vous? Quelle version de msxml?