【问题标题】:XmlReader not recognizing EndElementXmlReader 无法识别 EndElement
【发布时间】:2011-11-01 08:00:31
【问题描述】:

我有一个没有类似于以下格式的 XML 字符串:

<SomeTag><Tag>tag 1</Tag><Tag>tag 2</Tag><Tag>tag 3</Tag><Tag>tag 4</Tag></SomeTag>

当我运行这段代码时:

using (XmlReader reader = XmlReader.Create(stream))
            {
                reader.MoveToContent();

                while (reader.Read())
                {
                    if ((reader.NodeType == XmlNodeType.Element) && (string.Compare(reader.Name, name, StringComparison.InvariantCultureIgnoreCase) == 0))
                    {
                        var element = (XElement)XNode.ReadFrom(reader);
                        yield return element;
                    }
                }
                reader.Close();
            }

它只将节点的标签1和标签3识别为Element,将标签2和标签4识别为TextNodes。

为什么?

我该怎么做才能解决它?

仅供参考,如果我在每个标签之后添加带有换行符的格式,它会按预期工作,将所有标签识别为元素。但是,我无法控制提供给我的 XML。

【问题讨论】:

    标签: .net .net-4.0 linq-to-xml xmlreader


    【解决方案1】:

    怀疑问题在于XNode.ReadFrom 已经将阅读器定位在下一个元素的“开始”位置 - 然后您调用Read,它在元素上移动并且到下一个节点。

    不过,这只是一个猜测 - 这是 XmlReader 让事情变得棘手的事情 :( 尝试以您是否刚刚调用 ReadFrom 为条件进行 Read 调用。类似这样的事情:

    using (XmlReader reader = XmlReader.Create(stream))
    {
        reader.MoveToContent();
    
        while (!reader.EOF)
        {
            if (reader.NodeType == XmlNodeType.Element &&
                reader.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase))
            {
                var element = (XElement)XNode.ReadFrom(reader);
                yield return element;
            }
            else
            {
                reader.Read();
            }
        }
    }
    

    【讨论】:

    • 似乎有效。仅供参考, reader.MoveNext() 不存在,但在该位置使用 reader.Read() 似乎是可以接受的。感谢您的快速回复。
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2013-04-19
    相关资源
    最近更新 更多