【Delphi】インデント付きでXMLの保存

ここのページにサンプルがありまして

コードを抜粋しておきます

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 version="1.0" encoding="UTF-16" standalone="no"?>



エンコード,UTF-8で出したいのに,UTF-16でしか,出力できない感じ orz

んで,まえ,学校プロジェクトで吐き出していたXML@VC++版は,エンコードが,綺麗にS-JISと出てたよなぁ~
と思い出し…

んで,つらつら調べたら
エンコードを変えるには,IStreamを使うしか,手がなさそうな感じ…

VC++版を気合入れて,Delphi版へ書き換えてみましたわぁ~

あ,外部のpasファイルがいりますんで,注意!

//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は出力されていますわぁ~~♪