2010-11-29 7 views
4

Ich habe ein XML-Dokument auf Eingabe, die furchtbar formatiert ist (es ist Delphi-Projektdatei, wenn jemand interessiert) - inkonsistente Einrückung, leere Zeilen, Knotenstrings zusammen:Wie man XML programmatisch umformatiert?

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


</Excluded_Packages> 

Ich möchte es in etwas nettes neu formatieren. Was ist der einfachste Weg, das programmatisch mit Win32/COM zu tun? Wenn MSXML, wie gehe ich vor?

Ich möchte auch die Einrückungseinheit angeben können (Tab/mehrere Leerzeichen).

Ich habe versucht, Delphi MSXML Wrapper TXmlDocument und es tatsächlich die leeren Zeilen und Einzug Knoten mit Tabs, aber es teilt keine Zeilen wie diese:

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

Haben Sie sich xsltproc angesehen? –

+0

Scheint, ein Befehlszeilenwerkzeug zu sein, aber ich bin neu in XML/XSLT, also wenn ich etwas falsch verstehe, bitte erarbeiten. – himself

Antwort

15

ich die FormatXMLData Funktion in einem delphi getestet Projektdatei und funktioniert ok, alle Zeilen korrekt einrücken.

überprüfen Sie diesen Code.

uses 
XMLIntf, 
XMLDoc; 

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

Fehler in TXMLDocument-Variablen in einigen Versionen (einschließlich Delphi 2007) verursachten Speicherverluste ... Ich habe es noch nicht in Delphi 2009 getestet, aber seitdem verwende ich nur Variablen vom Typ IXMLDocument. Vielleicht war das der Grund, den Verweis auf Null in diesem Codebeispiel zu setzen, anstatt Free zu verwenden? – mjn

+0

RRUZ, Sollte oXml nicht als IXMLDocument definiert sein, da Sie sich auf die Referenzzählung verlassen, damit es freigegeben wird? Außerdem müsste XMLIntf zur uses-Klausel hinzugefügt werden. –

+0

Alan du hast Recht. Code korrigiert. – RRUZ