最近其他项目组遇到一个数据导出XML的小问题,因为我以前对操作XML比较熟悉,自然找到我帮助结局。其实DELPHI操作XML还是很方便的,问题出在他们的XML头部必须有 !DOCTYPE 部分 例如下面的XML代码:
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">
<root>
<test>
<add key="-1" filename="oFile"/>
</test>
</root>
<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">
<root>
<test>
<add key="-1" filename="oFile"/>
</test>
</root>
对于在C#中很好操作,DELPHI这部分代码相对较少,在GOOGLE上搜索也没结果,于是我看了一下DELPHI的 NativeXml.pas 源代码,发现其中有 xeDoctype 的定义,这正是我们要找的。哈。。
定义XML DOCTYPE 的 DELPHI代码如下:
uses NativeXml
procedure TForm1.Button1Click(Sender: TObject);
var
xml: TNativeXML;
n_bs: TXMLNode;
begin
xml := TNativeXml.CreateName('root');
xml.EncodingString := 'GB2312';
xml.XmlFormat := xfReadable;
//正常XML部分
n_bs := xml.Root.NodeNew('test');
n_bs := n_bs.NodeNew('add');
n_bs.WriteAttributeString('key', '-1');
n_bs.WriteAttributeString('filename', 'oFile');
//添加 <!DOCTYPE ?> 部分
n_bs := TXmlNode.CreateType(xml, xeDoctype);
n_bs.ValueDirect := 'math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd"';
xml.RootNodeList.NodeInsert(1, n_bs);
var
xml: TNativeXML;
n_bs: TXMLNode;
begin
xml := TNativeXml.CreateName('root');
xml.EncodingString := 'GB2312';
xml.XmlFormat := xfReadable;
//正常XML部分
n_bs := xml.Root.NodeNew('test');
n_bs := n_bs.NodeNew('add');
n_bs.WriteAttributeString('key', '-1');
n_bs.WriteAttributeString('filename', 'oFile');
//添加 <!DOCTYPE ?> 部分
n_bs := TXmlNode.CreateType(xml, xeDoctype);
n_bs.ValueDirect := 'math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd"';
xml.RootNodeList.NodeInsert(1, n_bs);
xml.SaveToFile('1.xml');
end;
这样我们就输出上面的XML文件了。