如何以编程方式重新格式化XML?

时间:2010-11-29 15:36:22

标签: xml delphi msxml

我有一个关于输入的XML文档,格式很糟糕(如果有人关心的话,它是Delphi项目文件) - 不一致的缩进,空行,节点字符串集中在一起:

<BorlandProject><Delphi.Personality><Parameters><Parameters Name="HostApplication">C:\Some\Path\Filename.exe</Parameters> <!--etc--> <Excluded_Packages>


</Excluded_Packages>

我想将其重新格式化为好的东西。使用Win32 / COM以编程方式执行此操作的最简单方法是什么?如果是MSXML,我该怎么办呢?

我希望能够指定缩进单位(制表符/多个空格)。

我尝试使用Delphi的MSXML包装器TXmlDocument,它确实删除了带有制表符的空行和缩进节点,但它不会像这样拆分行:

<BorlandProject><Delphi.Personality><Parameters><Parameters Name="HostApplication">C:\Some\Path\Filename.exe</Parameters> <!--etc--> <Excluded_Packages>

2 个答案:

答案 0 :(得分:19)

我在delphi项目文件中测试了FormatXMLData函数并且正常工作,正确缩进所有行。

检查此代码。

uses
 XMLIntf,
 XMLDoc;

Procedure FormatXMLFile(const XmlFile:string);
var
   oXml : IXMLDocument;
 begin
   oXml := TXMLDocument.Create(nil);
   oXml.LoadFromFile(XmlFile);
   oXml.XML.Text:=xmlDoc.FormatXMLData(oXml.XML.Text);
   oXml.Active := true;
   oXml.SaveToFile(XmlFile);
 end;

答案 1 :(得分:0)

我使用Tidy来格式化XML。使用xmlDoc.FormatXMLData的RRUZ方法非常有效,使用它是有意义的,但如果你的XML文件碰巧很大,那么它可能效果不好。当我尝试格式化一个100 MB的单行XML文件时,应用程序因4GB机器上的内存不足错误而崩溃,而且速度非常慢。

我使用了tidy的命令行版本。还有一个DLL版本,并且有一个Delphi头文件,你可以搜索,但我发现通过CreateProcess运行exe更方便,而不是学习DLL API。

这是我使用的命令行:

tidy.exe -xml -wrap 0 -indent -quiet -o outFile.xml inFile.xml

tidy.exe是独立的,您不需要DLL或其他任何东西。

格式化XML的其他可能性是xmllint和xml starlet。

我根本无法运行xmllint,但如果我坚持下去,我相信我可以拥有。

xml starlet似乎运行良好,但它没有任何选项可以写入文件,只有stdout,所以我没有使用它,因为我不得不弄清楚如何捕获输出。