【问题标题】:Badly formated XML generated by XElement.ReplaceWith()XElement.ReplaceWith() 生成的格式错误的 XML
【发布时间】:2010-01-25 21:51:38
【问题描述】:

我正在尝试使用 ReplaceWith() 替换节点,但注意到它会导致 XML 格式错误(缺少新行和缩进)。

以前有人遇到过这个问题吗?


代码片段:

[Test]
public void Test()
{
    XDocument document;

    using (var reader = XmlReader.Create("C:\\test.xml"))
    {
        // *** Running this line results in new lines OMITTED ***
        document = XDocument.Load(reader);

        // *** Running this line results in proper formatting ***
        //document = XDocument.Parse(XDocument.Load(reader).ToString());

    }

    var newNode = new XElement("Node", new XElement("SubNode"));

    document.Root.Element("Node").ReplaceWith(newNode);

    Console.Out.WriteLine("document = {0}", document);
}

复制步骤:

1) 使用以下内容创建 C:\test.xml:

<Test>
    <Node/>
<Test>

2) 运行上面的代码sn-p。

这会导致一些格式不正确的XML:

<Test>
    <Node><SubNode /></Node>
</Test>

3) 取消注释此行:

document = XDocument.Parse(XDocument.Load(reader).ToString());

4) 再次运行 sn-p。

结果将被正确格式化:

<Test>
  <Node>
    <SubNode />
  </Node>
</Test>

【问题讨论】:

  • 能否包含test.xml文件的内容?
  • 已编辑。该文件中的内容只是

标签: c# .net xml xmlreader


【解决方案1】:

虽然 XElement / XDocument 在解析 xml 时会“很好地”格式化 xml(使用 .Parse()),但它似乎没有明确打印其内容的方法。这实际上是对 .net 框架的一个很好的补充。

您指定的 hack 虽然效率不高,但它是一种快速的方法:

XDocument.Parse(XDocument.Load(reader).ToString());

【讨论】:

    【解决方案2】:

    结果是有效的 XML。换行和缩进在 XML 中无关紧要。

    如果您需要漂亮的打印,您可以在完成对 XML 的操作后进行。

    【讨论】:

    • 公平地说,他实际上并没有声称它是无效的。
    • @Mike:是的 - 我只是在强调它是有效的,当他需要漂亮的打印时,他应该要么克服“格式”,要么自己明确格式化。
    • @John:它确实是有效的 XML。但没想到 ReplaceWith() 同时搞乱了格式!
    • @stung:XML 没有格式。字符串有格式。可以从 XML 生成格式化字符串。 XElement 不代表字符串 - 它代表 XML 元素。
    • @John:你完全正确。不知何故,我认为 XElement 在内部保持 XML 整洁。我对这个假设的错误。但是,由 XmlReader 格式构造的 XDocument 与由 XML 字符串构造的 XDocument 有什么不同,这很奇怪。但如果事情就是这样,只要它清楚,我也很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2011-03-02
    • 2012-04-04
    • 2015-10-30
    • 2012-02-15
    • 2012-12-13
    相关资源
    最近更新 更多