我是windows phone的新手,所以我不知道如何解析从互联网上检索到的文档。
现在我可以通过控制台获得它并在其中打印。我想设置在我的poi类的实例中检索到的每个poi,该poi类具有xml中的所有字段。
通过这个我打印xml:
XDocument xdoc = XDocument.Parse(e.Result, LoadOptions.None);
System.Diagnostics.Debug.WriteLine(xdoc.FirstNode.ToString());
我的类POI有以下字段:
字符串:名称,描述,缩略图,url;双精度:lat, lon
我的xml是这样的:
<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:default="http://www.opengis.net/kml/2.2"
default:ar="http://www.openarml.org/arml/1.0"
default:wikitude="http://www.openarml.org/wikitude/1.0">
<Document>
<ar:provider xmlns:ar="http://www.openarml.org/arml/1.0"
id="myid.com">
<ar:name>Name of the owner</ar:name>
<ar:description><![CDATA[Description of the xml]]></ar:description>
<wikitude:providerUrl xmlns:wikitude="http://www.openarml.org/wikitude/1.0">www.webpage.es</wikitude:providerUrl>
<wikitude:tags xmlns:wikitude="http://www.openarml.org/wikitude/1.0">tag1,tag2,tag3,tag4</wikitude:tags>
<wikitude:logo xmlns:wikitude="http://www.openarml.org/wikitude/1.0">http://mylogourl.png</wikitude:logo>
<wikitude:icon xmlns:wikitude="http://www.openarml.org/wikitude/1.0">www.myiconurl.png</wikitude:icon></ar:provider>
<default:Placemark id="id53">
<ar:provider xmlns:ar="http://www.openarml.org/arml/1.0">myid.com</ar:provider>
<default:name>PLACE</default:name>
<default:description><![CDATA[Description of the place.]]></default:description>
<wikitude:info xmlns:wikitude="http://www.openarml.org/wikitude/1.0">
<wikitude:thumbnail>http://urltothethumbnail/</wikitude:thumbnail>
<wikitude:url>http://urltotheplace.com</wikitude:url>
</wikitude:info>
<default:Point>
<default:coordinates>-3.0000000000,43.0000000000,0</default:coordinates>
</default:Point>
</default:Placemark>
</default:Document>
</default:kml>
我有很多位置标记(POI),都有相同的字段。我想有一个数组与所有的POI检索。
我试过这样做,但它显示0使用count:
var pois = xdoc.Root
.Elements("Placemark")
.Select(poi => new POI(
(String)stop.Attribute("name"),
(String)stop.Attribute("description"),
(String)stop.Attribute("thumbnail"),
(String)stop.Attribute("url"),
(Double)stop.Attribute("lat"),
(Double)stop.Attribute("lon")))
.ToList();
如果我能得到placemark的id,这将是有用的。我可以添加另一个变量到我的POI类。
编辑:我尝试了一个用户在他的回答中所说的,它通过给出一个异常而崩溃:System。在System.Xml.Linq.ni.dll中发生了nullexception…我添加了修改后的代码:XDocument xdoc = XDocument.Parse(e.Result, LoadOptions.None);
XNamespace ns = "http://www.opengis.net/kml/2.2";
var placemarks = xdoc.Root.Descendants(ns + "Placemark");
var pois = placemarks
.Select(poi => new POI(
(String)poi.Attribute("name"),
(String)poi.Attribute("description"),
(String)poi.Attribute("thumbnail"),
(String)poi.Attribute("url"),
(Double)poi.Attribute("lat"),
(Double)poi.Attribute("lon")))
.ToList();
System.Diagnostics.Debug.WriteLine(pois.Count);
原文中的代码:
xdoc.Root.Elements("Placemark")
不返回任何结果,因为Placemark元素不是数据中的根元素。而且,您还没有指定名称空间。如果您想获得文档中的所有Placemark元素,而不管它们可能位于何处,那么您可以这样做:
XNamespace ns = "http://www.opengis.net/kml/2.2";
var placemarks = xdoc.Root.Descendants(ns + "Placemark");
您的原始代码也将无法检索其他信息(名称,描述,缩略图等),因为这些数据实际上都没有存储在属性中。这些都包含在元素中,而不是属性中,并且在查询它们时还需要指定正确的名称空间(请参阅在上面的示例中如何指定名称空间)。最后,请注意,纬度、经度、缩略图和url数据包含在子元素中。你需要获取info和Point元素来查询它们