Hi Leute
Ich habe eine eigene XMLDOM Klasse geschrieben, die
XML Dokumente lesen, bearbeiten und schreiben kann. Wenn ich nun ein
XML Dokument lese und dort Knoten anfüge, werden diese beim Speichern nicht formatiert in das
XML File geschrieben. Hier habe ich zwar eine Lösung:
Delphi-Quellcode:
function TBMDXMLDOMDocument.SaveToFile(
const AFileName:
String): Boolean;
function WriteDocumentToStream(
const ADocument: IXMLDOMDocument2;
const AStream: IStream; AEncoding:
string = '
UTF-8'): Boolean;
var
lWriter: IMXWriter;
lReader: IVBSAXXMLReader;
begin
Result := FALSE;
try
// Setze die Properties des XML writer - einschließlich BOM, XML Deklaration und encoding
lWriter := CoMXXMLWriter60.Create;
lWriter.byteOrderMark := True;
lWriter.omitXMLDeclaration := False;
lWriter.Indent := True;
lWriter.encoding := AEncoding;
// Setze den XML writer auf den SAX content handler.
lReader := CoSAXXMLReader60.Create;
lReader.contentHandler := lWriter
as IVBSAXContentHandler;
lReader.dtdHandler := lWriter
as IVBSAXDTDHandler;
lReader.errorHandler := lWriter
as IVBSAXErrorHandler;
lReader.putProperty('
http://xml.org/sax/properties/lexical-handler', lWriter);
lReader.putProperty('
http://xml.org/sax/properties/declaration-handler', lWriter);
// Setze den Writer auf den Stream
lWriter.output := AStream;
// Nun parse das DOM mit dem SAX handler, und rufe den XML Writer auf
lReader.parse(ADocument);
// Schreibe
lWriter.flush;
Result := TRUE;
except
end;
end;
var
lStream: TFileStream;
begin
lStream := TFileStream.Create(AFilename, fmCreate
or fmShareDenyWrite);
try
Result := WriteDocumentToStream(XMLDoc, TStreamAdapter.Create(lStream), Encoding);
finally
FreeAndNil(lStream);
end;
end;
Jedoch hat diese Lösung das Problem, wenn die Datei UTF-8 kodiert ist, dass im
XML File die Umlaute nicht mehr UTF-8 konform gespeichert werden. Warum habe ich noch nicht rausgefunden.
Rufe ich nur die Save Methode des XMLDOM Dokumentes auf, werden die Knoten unformatiert in das
XML geschrieben und die Umlaute nicht mehr UTF-8 konform reingeschrieben.
Dem Anschein nach sind die Umlaute verdoppelt im Code:
- XML Tags vor dem Lesen:
<bundesland art="3">Oberösterreich</bundesland>
<land tld="at" iso_3166_alpha_3="AUT">Österreich</land>
XML Tags nach dem Schreiben:
<bundesland art="3">Oberösterreich</bundesland>
<land tld="at" iso_3166_alpha_3="AUT">Österreich</land>