XmlReader在嵌套时停止

时间:2014-02-03 12:16:31

标签: c# xmlreader

我有这个xml:

<Root>
   <Client>
     <Name>Some Name</Name>
     <Messages>
         <Type name="mail" value="a@a.com"></Type>
         <Type name="chat" value="some-username"></Type>
     </Messages>
   </Client>
   ...................MORE CLIENTS HERE
</Root>

我用xmlreader循环它并且它按预期工作。
问题是当我尝试在节点"<Type"上循环时,这是第一个代码停止的地方。

代码正确读取xml,但在嵌套while的第一次迭代后停止:

using (XmlReader reader = XmlReader.Create(new StringReader(xmlString), settings))
{
    while (reader.ReadToFollowing("Client"))
    {
         reader.ReadToFollowing("Name");
         var message = reader.ReadElementContentAsString();
         Trace.WriteLine("message: " + message);

         while (reader.ReadToFollowing("Type")){
              var value = reader.GetAttribute("value");
              var name = reader.GetAttribute("name");

         }//everything stops here///
    }
}

如何在第一位客户后继续?
感谢

1 个答案:

答案 0 :(得分:2)

这应该有用,主要区别在于:

  • ReadToFollowing通过整个文档读取数据,这意味着通过所有客户端节点而不仅仅是一个子树
  • 要解决这个问题,您需要先阅读Message元素并为子树(ReadSubtree)创建一个阅读器,以保存您的数据Client节点

    using (XmlReader reader = XmlReader.Create(new StringReader(xmlString), settings))
        {
            while (reader.ReadToFollowing("Client"))
            {
                reader.ReadToFollowing("Name");
                var message = reader.ReadElementContentAsString();
    
                //advance to <Message> element
                reader.ReadToFollowing("Messages");
    
                //create sub-tree reader to restrict the scope
                var typeReader = reader.ReadSubtree();
    
                while (typeReader.ReadToFollowing("Type"))
                {
                    var value = reader.GetAttribute("value");
                    var name = reader.GetAttribute("name");
                }//everything stops here///
            }
        }