Speichern von XML in UTF-8 mit MSXML
Ich versuche zu laden, eine einfache Xml-Datei (UTF-8-codiert):
<?xml version="1.0" encoding="UTF-8"?>
<Test/>
Und speichern Sie es mit MSXML in vbscript:
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.Load("C:\test.xml")
xmlDoc.Save "C:\test.xml"
Das problem ist, MSXML speichert die Datei im ANSI statt UTF-8 (trotz der ursprünglichen Datei, die in UTF-8 codiert).
Den MSDN-Dokumentation für MSXML sagt, dass save() wird die Datei schreiben, in welcher Codierung die XML definiert ist:
Zeichenkodierung basiert auf dem encoding-Attribut in der XML-Deklaration, wie . Wenn keine encoding-Attribut angegeben ist, die Voreinstellung ist UTF-8.
Aber das ist eindeutig nicht funktioniert zumindest auf meinem Rechner.
Wie kann MSXML speichern in UTF-8?
Ich sehen nicht das Verhalten, das du meldest. Wenn ich ausführen, dass code, speichert das XML-Dokument in UTF-8. Bekomme ich eine UTF-8-Deklaration, und die eigentlichen strings werden in UTF-8.
Ja, es könnte sehr gut nur meine Maschine (Win2k3) und mein Kollege (Win2k8 64bit) das ist das problem. Es wäre schön, wenn jemand definitiv sagen, warum das Verhalten unterscheidet sich unter den Maschinen.
Ja, es könnte sehr gut nur meine Maschine (Win2k3) und mein Kollege (Win2k8 64bit) das ist das problem. Es wäre schön, wenn jemand definitiv sagen, warum das Verhalten unterscheidet sich unter den Maschinen.
InformationsquelleAutor stung | 2010-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine nicht-ANSI-text in Ihrem XML-Datei, so wird es gleich sein, ob UTF-8 oder ASCII-codiert. In meinen tests, nach Zugabe von nicht-ASCII-text test.xml, MSXML speichert immer in UTF-8-Codierung und schreibt auch die Stückliste, falls es eines gab, um mit zu beginnen.
http://en.wikipedia.org/wiki/UTF-8
http://en.wikipedia.org/wiki/Byte_order_mark
Per definition gibt es keinen Unterschied zwischen ASCII und UTF-8-Datei, wenn es enthält nur ASCII-Zeichen (außer für die Stückliste, falls im Lieferumfang enthalten)...
InformationsquelleAutor Kyle Alons
Verwenden Sie zwei weitere Klassen, die in MSXML zu schreiben, die XML korrekt codiert wird, um ein Ausgabe-stream.
Hier ist mein Helfer-Methode, schreibt eine generische IStream:
Speichern, um zu einer Datei, die ich rufen Sie die Stream version mit einem FileStream:
Können Sie konvertieren die Funktionen zu, was auch immer Sprache, die Sie möchten. Diese sind Delphi.
HRESULT ISAXXMLReader::putProperty ( unsigned short * pwchName, const _variant_t & varValue )
dies erfordert unsigned short-Zeiger als parameter. Durch Zufall Sie wissen, ob es irgendwelche enums oder #definiert für Eigenschaften unterstützt oder wie könnte ich angebenlexical-handler
unddeclaration-handler
Eigenschaften?Ich weiß gar nicht, was
lexical-handler
oderdeclaration-handler
sind! 🙂 Man sollte wohl Fragen, wie eine vollständige neue Frage.Fair genug, ich sah nur Sie diese in Ihre Antwort: ` die Leser.putProperty('xml.org/sax/properties/lexical-handler', Autor);` und ich dachte, ich probiere es aus.
InformationsquelleAutor Ian Boyd
Beim ausführen
load
msxml nicht kopieren Codierung aus der Verarbeitungsanweisung in das erstellte Dokument. So ist es nicht enthalten alle Kodierung und scheint, wie msxml wählt etwas, das es mag. In meiner Umgebung ist es UTF-16, die ich nicht bevorzugen.Die Lösung ist, um die Verarbeitung Anweisungen und geben Sie die Codierung gibt. Wenn Sie wissen, dass das Dokument keine Verarbeitung von Anweisungen, der code ist trivial:
Wenn es möglich ist, dass das Dokument enthalten anderen eine processing instruction, die zuerst entfernt werden müssen (also den code unten kommen muss, bevor der code oben). Ich weiß nicht, wie zu verwenden
selectNode
es zu tun, so dass ich nur iterierten alle root-Knoten:Sorry wenn der code nicht direkt ausführen, da ich die modifizierte version arbeiten, dass geschrieben wurde, sowas Brauch, nicht vbscript.
InformationsquelleAutor Jarekczek