XmlReader / Writer给出了end元素的错误

时间:2014-09-08 23:02:19

标签: c# xmlreader xmlwriter

我有一个表示格式良好的xml文档的流。我正在尝试使用XmlReader / Writer,我只是想读取整个流并再次将其写出来。

这似乎适用于普通的终端元素:

<Context>some text</Context>

以及像这样的“短”结束元素:

<Context/>

在这些情况下,我正确地得到了一个开始和结束元素事件。

但是,如果短结束元素后面紧跟正常的结束元素:

<Item><Context/></Item>

然后我在context元素上得到一个start元素,但不是end元素!

这种简单的阅读切换和写作解释了这种奇怪的行为有什么问题?

using (XmlReader reader = XmlReader.Create(new StreamReader(GetTestXMLStream())))
using (XmlWriter writer = XmlWriter.Create(output, new XmlWriterSettings {Indent = 4}))
{
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element:
            {
                //Triggers for <Context/>
                writer.WriteStartElement(reader.Name);
                break;
            }
            case XmlNodeType.Text:
            {
                writer.WriteString(reader.Value);
                break;
            }
            case XmlNodeType.EndElement:
            {
                //Triggers for <Context/>, but not if <Context/> is followed by </Item>. But does trigger for </Item> itself.
                writer.WriteFullEndElement();
                break;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

EndElement后面没有空元素。因此,您需要检查IsEmptyElement以处理此类节点(文章中的部分示例):

   while (reader.Read()){
     if (reader.IsStartElement()){
       if (reader.IsEmptyElement)
          Console.WriteLine("<{0}/>", reader.Name);
       else{

请注意,使用XElement(可能使用LINQ-to-XML)或甚至XmlDocument API通常更容易使用并拥有更多样本。除非您的XML文档是10Mb +,否则请考虑切换。