ここのページにサンプルがありまして
コードを抜粋しておきます
DELPHI:
- procedure SaveXMLToFile(FileName: TFileName);
- var
- lStringList: TStringList;
- Writer: IMXWriter;
- Reader: IVBSAXXMLReader;
- begin
- Writer := CoMXXMLWriter.Create;
- Reader := CoSAXXMLReader.Create;
- Writer.byteOrderMark := True;
- Writer.omitXMLDeclaration := False;
- Writer.indent := True;
- Reader.contentHandler := Writer as IVBSAXContentHandler;
- Reader.dtdHandler := Writer as IVBSAXDTDHandler;
- Reader.errorHandler := Writer as IVBSAXErrorHandler;
- Reader.putProperty('http://xml.org/sax/properties/lexical-handler', Writer);
- Reader.putProperty('http://xml.org/sax/properties/declaration-handler', Writer);
- Reader.parse(FDoc);
- lStringList := TStringlist.Create;
- lStringList.Text := Writer.output;
- lStringList.SaveToFile(FileName);
- end;
んで,お手軽にインデント付きでXMLが出力できるんですが...
XMLファイルの先頭が必ず
XML:
- <?xml version="1.0" encoding="UTF-16" standalone="no"?>
に
エンコード,UTF-8で出したいのに,UTF-16でしか,出力できない感じ orz
んで,まえ,学校プロジェクトで吐き出していたXML@VC++版は,エンコードが,綺麗にS-JISと出てたよなぁ~
と思い出し...
んで,つらつら調べたら
エンコードを変えるには,IStreamを使うしか,手がなさそうな感じ...
VC++版を気合入れて,Delphi版へ書き換えてみましたわぁ~
あ,外部のpasファイルがいりますんで,注意!
DELPHI:
- //uses ShLwApi;
- //**********************************************
- //インデントつきでXMLの保存
- //
- //**********************************************
- procedure TClaimOutput.SaveIndentXML(fname: string; pDoc: IXMLDOMDocument);
- var
- stmFile : IStream;
- wrt : IMXWriter;
- rdr : IVBSAXXMLReader;
- begin
- SHCreateStreamOnFile(
- PChar(fname),
- STGM_READWRITE or STGM_SHARE_DENY_WRITE or STGM_CREATE,
- stmFile
- );
- wrt := CoMXXMLWriter.Create;
- wrt.indent := True;
- wrt.encoding := 'utf-8';
- wrt.version := '1.0';
- wrt.output := stmFile;
- rdr := CoSAXXMLReader.Create;
- rdr.contentHandler := wrt as IVBSAXContentHandler;
- rdr.parse(pDoc);
- end;
SHCreateStreamOnFile()を利用するため,ShLwApi.pasがいります
Delphi5じゃ,なかったです
んで,ここから,ダウンロードしてきました
とりあえず,インデント付きでXMLは出力されていますわぁ~~♪



