这是代码 (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是一种文本格式!
我不相信我的内容是混杂的。
遗憾的是,我还没有诊断出具体问题,但我可以说存在一个问题,并且它似乎通过 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);
它“昂贵”,但我的文档很小,所以我不在乎。