IXMLDocument.SaveToFile()使用制表符而非空格进行缩进

7

我有一个XML文件,原本使用空格缩进格式化(每个嵌套项使用2个空格)。

当我使用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
你可能想阅读Zarko Gajic撰写的这篇文章delphi-format-xml-node-indent。所提供的解决方案使用xmlDoc.FormatXMLData以良好的方式格式化文件。 - LU RD
我现在看到问题所在了,FormatXMLData函数无法知道你正在使用哪个NodeIndentStr,因为你正在向该函数传递一个字符串,因此它使用默认的TAB字符。 - TLama
@TLama,那么解决方案是什么? - Andrew
1
你尝试过使用 preserveWhiteSpace (IXMLDOMDocument) 吗? - kobik
1
有一个选项 poPreserveWhiteSpace。使用方式如下:Document.ParseOptions := Document.ParseOptions + [poValidateOnParse] + [poPreserveWhiteSpace];。这样做可以完成任务吗?抱歉,Kobik,我刚看到你的评论。 - LU RD
@LURD,不要担心:) 实际上,如果它有效,您需要将其发布为答案,因为我是在引用“IXMLDOMDocument”。然后我会删除我的答案。 - kobik
2个回答

11

IXMLDocument 中有一个选项,可以告诉解析器保留空格。

使用方法如下:

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

声明:我没有尝试过它。


+1. 我现在使用的是D5版本,无法在更新的Delphi版本中进行测试,但如果IXMLDocumentIXMLDOMDocument的包装器,则应该可以正常工作(已使用IXMLDOMDocument进行测试)。 - kobik
1
是的,它有效。谢谢。注意:在调用LoadFromFile()之前应该设置ParseOptions - Andrew
我也点赞。这个可以解决问题。也许最好提一下不需要使用NodeIndentStrdoNodeAutoIndent选项,因为你将字符串传递给FormatXMLData函数(而不是文档本身),因此它有自己的设置。你可以移除poValidateOnParse标志;-) - TLama
@Andrew,可能是这样,但最好在分配正在解析的新XML文档之前说出Document.XML.Text - TLama
1
你可以像这样缩短选项分配:`Document.ParseOptions + [poValidateOnParse, poPreserveWhiteSpace];',去掉一对括号。 :) - Ken White

0

我不确定有什么不同,但是对我来说无法访问Document.ParseOptions + [poValidateOnParse, poPreserveWhiteSpace];

类似的东西可以工作:

var
    xmlDoc: IXMLDOMDocument2;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接