由XElement.ReplaceWith()生成的格式错误的XML

时间:2010-01-25 21:51:39

标签: c# .net xml xmlreader

我正在尝试使用ReplaceWith()替换节点,但发现它导致格式错误(缺少新的行和缩进)。

之前有没有人遇到过这个问题?


代码段:

[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)运行上面的代码片段。

这将导致某些XML格式不正确:

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

3)取消注释这一行:

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

4)再次运行代码段。

结果将正确格式化:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

如果你需要它打印漂亮,你可以在完成操作XML之后这样做。