2012-04-18 76 views
7

我有一個XML文件,最初使用空格縮進格式(每個嵌套項目爲2個空格)。IXMLDocument.SaveToFile()使用製表符而不是空格

當我使用IXMLDocument加載並保存此文件時,空格縮進正在更改爲製表符(代碼#9)。

下面是代碼:

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

我試圖用NodeIndentStr財產 - 沒有結果:

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

使用FormatXMLData太多 - 沒有結果:

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

我怎麼能用空格縮進而不是製表符保存?

+1

你可能想看看這篇文章由扎克Gajic,[德爾福格式的XML節點縮進(http://delphi.about.com/od/delphitips2009 /qt/delphi-format-xml-node-indent.htm)。提供的解決方案使用'xmlDoc.FormatXMLData'格式化文件。 – 2012-04-18 07:55:54

+0

@LURD嘗試 - 沒有結果:( – Andrew 2012-04-18 08:00:15

+0

我看到現在的問題在哪裏,'FormatXMLData'沒有機會知道你使用了什麼'NodeIndentStr',因爲你將一個字符串傳遞給該函數,因此它使用默認的TAB char。 – TLama 2012-04-18 08:17:08

回答

11

IXMLDocument中有一個選項,可以告訴解析器保留空格。

使用方法如下:

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

聲明:我還沒有嘗試過。

+0

+1。我現在在D5上,不能用新版本的Delphi測試它,但是如果IXMLDocument'是IXMLDOMDocument'的包裝器,這應該可以工作(用'IXMLDOMDocument'測試)。 – kobik 2012-04-18 09:54:16

+1

是的,它的工作原理。謝謝。注意:'ParseOptions'應該在我的'LoadFromFile()' – Andrew 2012-04-18 10:09:18

+0

+1之前設置。這有竅門。也許沒關係,因爲你將字符串傳遞給'FormatXMLData'函數(不是文檔本身),所以沒有必要使用'NodeIndentStr'和'doNodeAutoIndent'選項,因此它有它自己的設置。您可以刪除'poValidateOnParse'標誌;-) – TLama 2012-04-18 10:11:23

0

我不確定有什麼不同,但Document.ParseOptions + [poValidateOnParse,poPreserveWhiteSpace];我無法使用

也有類似的工作:

var 
    xmlDoc: IXMLDOMDocument2; 

xmlDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument2; 
xmlDoc.validateOnParse := True; 
xmlDoc.preserveWhiteSpace := True; 
相關問題