2012-04-18 198 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; 
相关问题