8
votes

Comment faire de XMLDOMDocument Inclure la Déclaration XML?

Quand un XMLDOMDocument se sauve, comment puis-je l'obtenir pour inclure la déclaration XML , par exemple.:

  • L'objet XMLDOMDomCument est créé en mémoire (c'est-à-dire que le XML n'est pas chargé de certaines sources extérieures): xxx

    sans la déclaration XML que vous Obtenez le corps XML, par exemple: xxx

    plutôt que le document XML complet: xxx

    question 2

    Comment puis-je contrôler le encoder le XMLDOMDocument utilisera quand il enregistre un flux? < / p>


1 commentaires

Quelle langue et quelle plate-forme utilisez-vous? Quelle version de msxml?


5 Réponses :


8
votes

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


5 commentaires

C'est exactement ce dont j'avais besoin. La syntaxe Sortie 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 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 que spécifiant écrivain.byteordermark = true 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 à False cause la suppression de l'écriture de la naissance. Réglage byeordermark à 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 est ignoré si la sortie est une chaîne, msdn.microsoft.com/en-us/library/ms756020%28v=vs.85%29.aspx .



2
votes

voici un même chose en C ++ xxx < /pree >p>... et vous aurez besoin d'un Istream ... xxx

... et un explication de ce qui se passe.


0 commentaires

1
votes

Voici la même chose à Delphi: xxx

et une version d'écriture à un flux: xxx

note : tout code est libéré dans le domaine public. Aucune attribution requise.


0 commentaires

4
votes

Vous devriez être capable d'obtenir la même chose en utilisant la méthode de créationProcessinginstruction.

exemple; xxx


1 commentaires

En plus de cela, j'ai eu besoin de changer le "" à \ "a-t-il fonctionné comme annoncé, merci d'avoir ajouté la bonne solution.



-1
votes

C ++: xxx

car, sérieusement, la solution correcte est une blague ...


0 commentaires