2016-10-03 106 views
0

考虑下面的XML(例如):通过子元素循环使用的XmlReader

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

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

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

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

有什么想法?

回答

0

我不明白你为什么想在这里使用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); 
     } 
+0

如果我这样做,我必须跳过元素之间的WhitespaceNodes,并且我得到了“ReadElementContentAs方法在节点类型EndElement上不受支持”。在第二个元素上的ReadElementContentAsString()... –

+0

尝试在循环中跳过不是元素的所有东西:'if(reader.NodeType!= XmlNodeType.Element){continue; }' – sc3w

+0

看起来ReadElementContentAsString()也将读者定位在下一个元素上。它应该这样做吗?如果没有,那么我发现了一个我正在使用的平台上的错误(我正在智能设备上使用.Net CF克隆)。 Thx,它会解释很多:-s –