XmlReader无法识别EndElement

时间:2011-08-22 17:12:34

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

我有一个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为元素,并将标签2和标签4识别为TextNodes。

为什么?

我该怎么做才能修复它?

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

1 个答案:

答案 0 :(得分:3)

怀疑问题是XNode.ReadFrom已经将读者定位在“下一个元素的开头” - 然后你正在调用Read,它正在移动在元素上和下一个节点上。

这只是一个猜测 - 这是XmlReader使得棘手的事情:(尝试以Read调用条件取决于您是否刚刚调用ReadFrom。这样的事情:

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