2012-04-18 15 views
7

Mam plik XML, który jest oryginalnie sformatowany za pomocą wcięć spacji (2 spacje dla każdego elementu zagnieżdżonego).IXMLDocument.SaveToFile() używa znaku tab dla wcięcia zamiast spacji

Po załadowaniu i zapisaniu tego pliku przy użyciu dokumentu IXML, wcięcia spacji zmieniają się na znaki tabulacji (kod # 9).

Oto kod:

var 
    FileName: String; 
    Document: IXMLDocument; 
... 
Document := XMLDoc.LoadXMLDocument(FileName); 
Document.SaveToFile(FileName); 

Próbowałem użyć NodeIndentStr nieruchomości - bez rezultatu:

Document := XMLDoc.LoadXMLDocument(FileName); 
Document.NodeIndentStr := ' '; 
Document.SaveToFile(FileName); 

Używane FormatXMLData też - bez rezultatu:

Document := XMLDoc.LoadXMLDocument(FileName); 
Document.XML.Text := XMLDoc.FormatXMLData(Document.XML.Text); 
Document.Active := True; 
Document.SaveToFile(FileName); 

Jak mogę zapisywać z wcięciami spacji zamiast tabulatorów?

+1

Czasami warto przeczytać ten artykuł Zarko Gajic [Delphi-Format-xml-node-indent] (http://delphi.about.com/od/delphitips2009 /qt/delphi-format-xml-node-indent.htm). Dostarczone rozwiązanie używa 'xmlDoc.FormatXMLData', aby w wygodny sposób sformatować plik. –

+0

@LURD wypróbowany - brak wyniku :( – Andrew

+0

Widzę, gdzie leży teraz problem, "FormatXMLData" nie ma szansy dowiedzieć się, jakiego 'NodeIndentStr' używasz, ponieważ przekazujesz ciąg do tej funkcji, dlatego używa on domyślnej TAB char. – TLama

Odpowiedz

11

Istnieje opcja w IXMLDocument, gdzie parser może zostać poinformowany o zachowaniu białych znaków.

Używaj go tak:

Document.ParseOptions := 
    Document.ParseOptions+[poValidateOnParse]+[poPreserveWhiteSpace]; 

Oświadczenie: Nie próbowałem go.

+0

+1. Jestem teraz na D5 i nie mogę go przetestować z nowszymi wersjami Delphi, ale jeśli 'IXMLDocument' jest opakowaniem wokół' IXMLDOMDocument' to powinno działać (testowane z 'IXMLDOMDocument'). – kobik

+1

tak, to działa. Dziękuję Ci. Uwaga: 'ParseOptions' powinno być ustawione przed' LoadFromFile() ' – Andrew

+0

+1 ode mnie. To wystarczy. Może byłoby dobrze wspomnieć, że nie ma potrzeby używania opcji 'NodeIndentStr' ani' doNodeAutoIndent', ponieważ przekazujesz ciąg do funkcji 'FormatXMLData' (nie sam dokument), dlatego ma on własne ustawienia. I możesz usunąć flagę 'poValidateOnParse' ;-) – TLama

0

Nie jestem pewien, co jest różne, ale Document.ParseOptions + [poValidateOnParse, poPreserveWhiteSpace]; nie był dla mnie dostępny.

Coś podobnego pracował:

var 
    xmlDoc: IXMLDOMDocument2; 

xmlDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument2; 
xmlDoc.validateOnParse := True; 
xmlDoc.preserveWhiteSpace := True; 
Powiązane problemy