【问题标题】:XmlReader/Writer gives errors with end elementsXmlReader/Writer 给出结束元素的错误
【发布时间】:2014-09-08 23:02:18
【问题描述】:

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

这似乎适用于正常的结束元素:

<Context>some text</Context>

对于像这样的“短”结束元素:

<Context/>

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

但是,如果一个短结束元素之后紧跟一个普通结束元素:

<Item><Context/></Item>

然后我确实在上下文元素上得到了一个开始元素,但不是一个结束元素!

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

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;
            }
        }
    }
}

【问题讨论】:

    标签: c# xmlreader xmlwriter


    【解决方案1】:

    空元素后面没有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,否则请考虑切换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 2013-02-06
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多