【问题标题】:IXMLDocument.SaveToFile() uses tab character for indentation instead of spacesIXMLDocument.SaveToFile() 使用制表符而不是空格来缩进
【发布时间】:2012-04-18 07:38:44
【问题描述】:

我有一个 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);

如何使用空格缩进而不是制表符来保存?

【问题讨论】:

  • 您可能想阅读 Zarko Gajic 的这篇文章,delphi-format-xml-node-indent。提供的解决方案使用xmlDoc.FormatXMLData 以一种很好的方式格式化文件。
  • 我知道现在问题出在哪里,FormatXMLData 没有机会知道您使用的是什么NodeIndentStr,因为您将字符串传递给该函数,因此它使用默认的 TAB 字符。
  • @TLama 那么解决方案是什么?
  • 你试过用preserveWhiteSpace (IXMLDOMDocument)吗?
  • 有一个选项poPreserveWhiteSpace。像这样使用:Document.ParseOptions := Document.ParseOptions+[poValidateOnParse]+[poPreserveWhiteSpace];。这样做有用吗?抱歉,Kobik,刚刚看到你的评论。

标签: xml delphi delphi-2010 indentation auto-indent


【解决方案1】:

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

像这样使用它:

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

免责声明:我没有尝试过。

【讨论】:

  • +1。我现在在 D5 上,无法使用较新版本的 Delphi 对其进行测试,但如果 IXMLDocumentIXMLDOMDocument 的包装器,这应该可以工作(使用 IXMLDOMDocument 测试)。
  • 是的,它有效。谢谢你。注意:ParseOptions 应设置在LoadFromFile() 之前
  • 我也是+1。这可以解决问题。也许可以提一下没有必要使用NodeIndentStrdoNodeAutoIndent 选项,因为您将字符串传递给FormatXMLData 函数(不是文档本身),因此它有自己的设置。您可以删除 poValidateOnParse 标志 ;-)
  • @Andrew,可能是,但最好在 Document.XML.Text 之前说,您正在分配正在解析的新 XML 文档。
  • 您可以像这样缩短选项分配:`Document.ParseOptions + [poValidateOnParse, poPreserveWhiteSpace];',删除一对括号。 :)
【解决方案2】:

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

类似的工作:

var
    xmlDoc: IXMLDOMDocument2;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多