我正在解析这个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);
}
答案 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数据的最佳方法