无法让 XDocument/XmlWriter 编写带有缩进和换行的 xml 文件(使用下面的 XmlProvider)

问题描述 投票:0回答:1

这是代码 (xml 文档本身是通过使用 FSharp.Data 中的 F# XmlProvider 读取 xml 创建的,然后通过其下属 XDocument 对其进行操作)

  static void Save(XDocument doc, string filename)
  {
     var settings = new XmlWriterSettings()
     {
        Indent = true,  // Set to true for indents
        IndentChars = "    ",  // Set the characters used for indentation
        NewLineChars = "\r\n",  // Set the newline characters
        NewLineHandling = NewLineHandling.Replace, // Replace the default newline characters
        Encoding = new UTF8Encoding(false)
     };

     using (var writer = XmlWriter.Create(filename, settings))
     {
        doc.Save(writer);
     }
  }

我知道这段代码正在工作(就保存实际使用的设置而言,因为当我在编码中打开和关闭 BOM 时,我可以在文件中看到它),但它将始终输出如下数据:

<ES_XMLXPATH xp_ordernr="1" xp_xpath="ES_PUBLICATIONRECORD/ds_program" /><ES_XMLXPATH xp_ordernr="1" xp_xpath="ES_PUBLICATIONRECORD/ds_program/ES_PRODUCT/masterProgram" /><ES_XMLXPATH xp_ordernr="1" xp_xpath="ES_PUBLICATIONRECORD/ds_program/ES_PRODUCT/masterProgram/ES_PRODUCT/oid" />

清楚地没有换行符和缩进。

我已以正常方式将这些元素添加到文档中,并且文档的其余部分(最初从磁盘读取)已使用缩进和换行符正确格式化,但出于某种原因,这些元素将违反任何格式。

我是否从根本上误解了某些内容(我经常使用 XML)。


ms 文档是这么说的

备注 该属性仅适用于输出文本内容的XmlWriter实例;否则,该设置将被忽略。 只要元素不包含混合内容,元素就会缩进。一旦调用 WriteString 或 WriteWhitespace 方法写出混合元素内容,XmlWriter 就会停止缩进。一旦混合内容元素关闭,缩进就会恢复。

我无法理解xmlwriter如何不输出文本内容,xml是一种文本格式!

我不相信我的内容是混杂的。

c# f# linq-to-xml xmlwriter
1个回答
0
投票

遗憾的是,我还没有诊断出具体问题,但我可以说存在一个问题,并且它似乎通过 XmlProvider 与 XML 相关,我可以提供解决方法,而不是修复。

所以答案似乎是,如果我使用普通的 XDocument,这一切都有效,如果我使用 FSharp.Data.XmlProvider,然后在提供程序内使用 XDocument 并向其中添加元素,则显然会感到困惑(FSharp.Data.XDocument)。 XmlProvider 可能已针对读取 xml 数据进行了优化,编写它有点滥用)。

所以解决方案!

要么不使用类型提供程序,要么...

通过将 XmlProvider xdocument 序列化为字符串并重新读取它,从头开始创建一个新的 xdocument。

(下面的 Save(..,..) 调用OP中的函数)。

 var doc = XDocument.Parse(newRoot.ToString());

 Save(doc, reportDef.FullName);

它“昂贵”,但我的文档很小,所以我不在乎。

© www.soinside.com 2019 - 2024. All rights reserved.