代码之家  ›  专栏  ›  技术社区  ›  himself

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

  •  4
  • himself  · 技术社区  · 14 年前

    我在输入端有一个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包装器txldocument,它确实删除了空行并用制表符缩进节点,但它没有像这样拆分行:

    <BorlandProject><Delphi.Personality><Parameters><Parameters Name="HostApplication">C:\Some\Path\Filename.exe</Parameters> <!--etc--> <Excluded_Packages>
    
    2 回复  |  直到 14 年前
        1
  •  19
  •   dan-gph    7 年前

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

    检查这个代码。

    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;
    
        2
  •  0
  •   dan-gph    7 年前

    我用过 Tidy 格式化XML。RRUZ使用xmlDoc.FormatXMLData的方法工作得很好,使用它是有意义的,但是如果您的XML文件碰巧很大,那么它可能不会工作得很好。当我试图格式化一个100MB的单行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,所以我没有使用它,因为我必须研究如何捕获输出。