根元素丢失 - 使用XmlTextWriter创建XmlDocument

7

我有以下代码,在doc.Load()期间出现“根元素丢失”的错误。

MemoryStream stream = new MemoryStream();
XmlTextWriter xmlWriter = new XmlTextWriter(stream, Encoding.UTF8);
xmlWriter.Formatting = System.Xml.Formatting.Indented;
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("Root");
XmlDocument doc = new XmlDocument();
stream.Position = 0;
doc.Load(stream);
xmlWriter.Close();

我无法找出问题所在,有什么见解吗?


2
(与此无关:虽然不是必需的,但您可以为MemoryStreamXmlTextWriter对象都使用using块--它们都是IDisposable。) - stakx - no longer contributing
3个回答

13
你还没有清除xmlWriter,所以它可能还没有写出任何内容。此外,你从未完成根元素,因此即使它已经写出了一些内容。
<Root>

如果你尝试以完整的文档形式加载它,那么它不会写入结束标签。

我不确定 XmlWriter 在什么时候实际上会写出元素的起始部分 - 不要忘记它可能还有要写入的属性。使用你提供的代码,最多只能写出<Root

这里是一个完整的程序,可以正常运行:

using System;
using System.IO;
using System.Text;
using System.Xml;

class Test
{
    static void Main(string[] args)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            XmlTextWriter xmlWriter = new XmlTextWriter(stream, Encoding.UTF8);
            xmlWriter.Formatting = System.Xml.Formatting.Indented;
            xmlWriter.WriteStartDocument();
            xmlWriter.WriteStartElement("Root");
            xmlWriter.WriteEndElement();
            xmlWriter.Flush();

            XmlDocument doc = new XmlDocument();
            stream.Position = 0;
            doc.Load(stream);
            doc.Save(Console.Out);
        }
    }
}

(请注意,我没有调用WriteEndDocument——只有当您还有打开的元素或属性时才需要调用该方法。)


请注意:通常使用.Close()比使用.Flush()更为正确,这是针对程序编写的。 - annakata
@annalata:我认为这会关闭流,而我们不想在这里这样做。通常我只会处理写入器。 - Jon Skeet

0

就像@Skeet所说的那样,此外,您似乎没有关闭您的元素:

xmlWriter.WriteEndElement();

我在我的第二句话中已经涵盖了这个问题 :) - Jon Skeet
确实如此,但是你在隐身模式下--这是我错过它的唯一原因。 :) - Robaticus

0

我看到你开始写这个文档了,但是在你使用它之前,我没有看到你结束关闭它...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接