【问题标题】:Looping through child elements with XmlReader使用 XmlReader 循环遍历子元素
【发布时间】:2016-10-03 08:57:22
【问题描述】:

给定以下 xml(示例):

<root>
    <foo>some data</foo>
    <bar>some other data</bar>
</root>

我目前正在阅读它:

reader.ReadToFollowing("root")
if(reader.HasAttributes) { /* not relevant in this usecase*/ }
while(reader.IsStartElement())
{
   reader.ReadStartElement()
   var elementName = reader.LocalName; 
   var value = reader.ReadElementContentAs(typeof(ExpectedType),null);
   //Process(elementName, value);
   reader.ReadEndElement();
} 

如果我这样运行它,我得到一个异常

'Element' 是无效的 XmlNodeType。在 reader.ReadEndElement();

如果我删除最后一行,while 只会执行一次。 foo 被正确处理,bar 未被读取。

有什么想法吗?

【问题讨论】:

    标签: c# .net xmlreader


    【解决方案1】:

    我不明白您为什么要在这里使用ReadStartElementReadEndElement 方法。看看我的代码,Read 方法将阅读器推进到下一个元素并返回 true,直到您在 XML 文档中剩下更多元素,所以它完全符合您的要求。

            reader.ReadToFollowing("root");
    
            if (reader.HasAttributes) { /* not relevant in this usecase*/ }
    
            while (reader.Read())
            {
                var elementName = reader.LocalName;
                var value = reader.ReadElementContentAsString();
    
                //Process(elementName, value);
            }
    

    【讨论】:

    • 如果我这样做,我必须跳过元素之间的 WhitespaceNodes,我得到“节点类型 EndElement 不支持 ReadElementContentAs 方法。”在第二个元素上的 ReadElementContentAsString() 上...
    • 尝试在循环中跳过所有不是元素的内容:if (reader.NodeType != XmlNodeType.Element) { continue; }
    • 似乎 ReadElementContentAsString() 也将阅读器定位在下一个元素上。它应该这样做吗?如果没有,那么我在我所在的平台上发现了一个错误(我在智能设备上使用 .Net CF 克隆)。谢谢,它会解释很多:-s
    • 这是一种假定行为,它在标准 .NET 4.5 上的工作方式类似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多