MSXML处理的XML都不带缩进,阅读起来比较困难,下面介绍种方法,可以把XML缩进的很漂亮,提高可读性。
注意:msxml2_tlb是msxml6的导入单元。
代码如下
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MSXML2_TLB, StdCtrls, ActiveX; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Button5: TButton; procedure Button5Click(Sender: TObject); private { Private declarations } procedure xmlPrettyPrint(xmlDoc : IXMLDOMDocument3); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button5Click(Sender: TObject); var xmlDoc : IXMLDOMDocument3; xnUsers, xnUser, xn : IXMLDOMNode; begin xmlDoc := CoDOMDocument60.Create; xnUsers := xmlDoc.createElement('users'); xmlDoc.appendChild(xnUsers); xnUser := xmlDoc.createElement('user'); xn := xmlDoc.createElement('name'); xn.text := '刘备'; xnUser.appendChild(xn); xnUsers.appendChild(xnUser); xnUser := xmlDoc.createElement('user'); xn := xmlDoc.createElement('name'); xn.text := '张飞'; xnUser.appendChild(xn); xnUsers.appendChild(xnUser); Memo1.Lines.Add('原XML :' +#13#10 + xmlDoc.xml); xmlPrettyPrint(xmlDoc); Memo1.Lines.Add('格式化后的XML :' +#13#10 + xmlDoc.xml); end; procedure TForm1.xmlPrettyPrint(xmlDoc: IXMLDOMDocument3); var reader : IVBSAXXMLReader; writer : IMXWriter; stringStream : TStringStream; stream : IStream; begin stringStream := TStringStream.Create(''); stream := TStreamAdapter.Create(stringStream, soOwned); //设置成soOwned表示,在TStreamAdapter释放时stringStream会一起释放 reader := CoSAXXMLReader60.Create; writer := CoMXXMLWriter60.Create; writer.indent := true; //缩进 writer.byteOrderMark := false;//输出UTF-8的BOM writer.disableOutputEscaping := true; writer.encoding := 'gb2312';//设置编码不起作用,不知道为什么 writer.standalone := true; writer.version := '1.0'; writer.omitXMLDeclaration := false; writer.output := stream; reader.contentHandler := writer as IVBSAXContentHandler; reader.errorHandler := reader.contentHandler as IVBSAXErrorHandler; reader.parse(xmlDoc); xmlDoc.loadXML(stringStream.DataString); end; end.
执行效果如下
原XML :
<users><user><name>刘备</name></user><user><name>张飞</name></user></users>
格式化后的XML :
<?xml version="1.0" standalone="yes"?>
<users>
<user>
<name>刘备</name>
</user>
<user>
<name>张飞</name>
</user>
</users>
从例子中可以看出,格式化前的无缩进XML,处理之后变得很漂亮了。
