2016-10-03 8 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();

마지막 줄을 제거하면 while은 한 번만 실행됩니다. foo가 올바르게 처리되고 막대가 읽히지 않습니다.

의견이 있으십니까?

답변

0

여기서 ReadStartElementReadEndElement 방법을 사용하려는 이유가 표시되지 않습니다. 내 코드를 살펴보면 Read 메서드는 독자를 다음 요소로 이동시키고 XML 문서에 더 많은 요소가 남아있을 때까지 true를 반환하므로 찾고자하는 것을 정확히 수행합니다.

 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 –