无法解析嵌套元素

时间:2014-01-12 18:26:26

标签: c# xml windows-phone-8 linq-to-xml

我正在解析这个XML,出于某种原因,当我尝试提取“路由”值时,我只获得列表中的第一个。所以基本上我可以提取“1”值,但其余的都被跳过/忽略。我认为它与嵌套元素有关,到目前为止“列表”但是我不确定问题是什么。

任何想法如何我可以提取所有路线值而不仅仅是列表中的第一个?

<information xmlns="http://testnamespace" xmlns:i="http://www.w3.org/2001/XMLSchema-      instance">
<errorcode>0</errorcode>
<errormessage/>
<numberofresults>1</numberofresults>
<timestamp>12/01/2014 17:20:04</timestamp>
<results>
   <result>
   <id>1234</id>
   <displayid>1234</displayid>
   <name>A Road</name>
   <name2>Another Road</name2>
     <element1>
       <element2>
         <name>abc</name>
        <routes>
          <route>1</route>
          <route>2</route>
          <route>3</route>
          <route>4</route>
          <route>5</route>
          <route>6</route>
        </routes>
       </element2>
     </element1>
</result>
</results>
</information>

这是我的代码:

foreach (var routeInfo in StopInfo.Descendants(ns + "routes"))
{
    string route = routeInfo.Element(ns + "route").Value;
    lstResults.Items.Add(route);
}

3 个答案:

答案 0 :(得分:2)

您只获得routes的单个路由元素(并且它将是值为1的第一个元素):

routeInfo.Element(ns + "route")

你为xml中的每个routes元素做同样的事情。因此,如果xml中只有一个routes元素,则最终会将单个值1添加到列表框中。您需要的是获取所选route元素的routes元素(它们是直接子元素,因此简单Elements()将完成此任务):

foreach (var route in StopInfo.Descendants(ns + "routes").Elements())
    lstResults.Items.Add((string)route);

另请注意,您可以简单地将XElement转换为字符串和其他类型以获取其值。如果找不到元素并且您正在尝试读取其值,那么这将允许避免异常。

答案 1 :(得分:0)

因为您需要多个route元素,所以您应该使用另一个循环:

foreach (var routeInfo in StopInfo.Descendants(ns + "routes"))
{
    foreach(var route = routeInfo.Elements(ns + "route"))
        lstResults.Items.Add((string)route);
}

答案 2 :(得分:0)

虽然Sergey Berezovskiy已经提供了解决方案,但我们也可以使用XMLSerializer和注释来解析windows phone中的xml以供参考http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer(v=vs.100).aspx

这可能会增加类的数量,但这是在Windows Phone中解析XML数据的最佳方法