最新の更新情報

2012年2月
« 1月    
 1234
567891011
12131415161718
19202122232425
26272829  

本ブログのURL

qrcode.png

雨雲の動き

お天気

 
 
吟遊詩人の戯言 内専用の記事検索...
 
 

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


キーワード(クリックで関連記事が読めます) → , , , ,

関連記事



 
 

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

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

DELPHI:
  1. procedure SaveXMLToFile(FileName: TFileName);
  2. var
  3.     lStringList: TStringList;
  4.     Writer: IMXWriter;
  5.     Reader: IVBSAXXMLReader;
  6. begin
  7.     Writer := CoMXXMLWriter.Create;
  8.     Reader := CoSAXXMLReader.Create;
  9.  
  10.     Writer.byteOrderMark := True;
  11.     Writer.omitXMLDeclaration := False;
  12.     Writer.indent := True;
  13.  
  14.     Reader.contentHandler := Writer as IVBSAXContentHandler;
  15.     Reader.dtdHandler := Writer as IVBSAXDTDHandler;
  16.     Reader.errorHandler := Writer as IVBSAXErrorHandler;
  17.     Reader.putProperty('http://xml.org/sax/properties/lexical-handler',    Writer);
  18.     Reader.putProperty('http://xml.org/sax/properties/declaration-handler',    Writer);
  19.  
  20.     Reader.parse(FDoc);
  21.  
  22.     lStringList := TStringlist.Create;
  23.     lStringList.Text := Writer.output;
  24.     lStringList.SaveToFile(FileName);
  25. end;


んで,お手軽にインデント付きでXMLが出力できるんですが...

XMLファイルの先頭が必ず

XML:
  1. <?xml version="1.0" encoding="UTF-16" standalone="no"?>




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

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

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

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

あ,外部のpasファイルがいりますんで,注意!
DELPHI:
  1. //uses ShLwApi;
  2.  
  3. //**********************************************
  4. //インデントつきでXMLの保存
  5. //
  6. //**********************************************
  7. procedure TClaimOutput.SaveIndentXML(fname: string; pDoc: IXMLDOMDocument);
  8. var
  9.     stmFile : IStream;
  10.     wrt : IMXWriter;
  11.     rdr : IVBSAXXMLReader;
  12. begin
  13.  
  14.     SHCreateStreamOnFile(
  15.             PChar(fname),
  16.             STGM_READWRITE or STGM_SHARE_DENY_WRITE or STGM_CREATE,
  17.             stmFile
  18.         );
  19.  
  20.     wrt := CoMXXMLWriter.Create;
  21.     wrt.indent := True;
  22.     wrt.encoding := 'utf-8';
  23.     wrt.version := '1.0';
  24.     wrt.output := stmFile;
  25.  
  26.     rdr :=  CoSAXXMLReader.Create;
  27.     rdr.contentHandler := wrt as IVBSAXContentHandler;
  28.  
  29.     rdr.parse(pDoc);
  30. end;


SHCreateStreamOnFile()を利用するため,ShLwApi.pasがいります
Delphi5じゃ,なかったです
んで,ここから,ダウンロードしてきました


とりあえず,インデント付きでXMLは出力されていますわぁ~~♪

 
 
 
 

コメントを残す

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">