2010-11-29 21 views
4

J'ai un document XML sur l'entrée qui est terriblement formaté (il est Delphi fichier de projet si quelqu'un se soucie) - indenter incompatibles, lignes vides, chaînes de nœuds Regroupés:Comment reformater le XML par programme?

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


</Excluded_Packages> 

Je veux reformater en quelque chose de bien . Quelle est la manière la plus simple de le faire par programmation, avec Win32/COM? Si MSXML, comment je vais faire?

J'aimerais aussi pouvoir spécifier l'unité d'indentation (onglet/plusieurs espaces).

J'ai essayé d'utiliser wrapper MSXML de TXMLDocument de Delphi et il ne supprime en effet les lignes vides et les nœuds des tabulations, mais il ne lignes fractionne pas comme celui-ci:

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

Avez-vous regardé xsltproc? –

+0

Semble être un outil de ligne de commande, mais je suis nouveau à XML/XSLT donc si je ne comprends pas quelque chose s'il vous plaît élaborer. – himself

Répondre

15

Je l'ai testé la fonction FormatXMLData dans un delphi fichier de projet et fonctionne bien, indent toutes les lignes correctement.

vérifiez ce 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

iirc usgae de variables TXMLDocument dans certaines versions (y compris Delphi 2007) causé des fuites de mémoire ... Je ne l'ai pas encore testé dans Delphi 2009 mais depuis lors, je n'utilise que des variables de type IXMLDocument. Peut-être que c'était la raison pour définir la référence à zéro dans cet exemple de code au lieu d'utiliser Free? – mjn

+0

RRUZ, Est-ce que oXml ne devrait pas être défini comme IXMLDocument, puisque vous comptez sur le comptage des références pour qu'il soit libéré? XMLIntf devrait également être ajouté à la clause uses. –

+0

Alan vous avez raison. code corrigé. – RRUZ