簡體   English   中英

在C#WP8中解析xml

[英]Parse xml in C# WP8

我是Windows手機的新手,所以我不知道如何解析從互聯網上檢索到的文件。

現在我可以通過控制台獲取它並打印在其中。 我想設置在我的POI類的實例中檢索的每個poi,其中包含xml中的所有字段。

通過這個我打印xml:

XDocument xdoc = XDocument.Parse(e.Result, LoadOptions.None);
System.Diagnostics.Debug.WriteLine(xdoc.FirstNode.ToString());

我的班級POI有以下字段:

字符串:名稱,描述,縮略圖,網址; 雙打: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使用計數:

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();

如果我能得到地標的ID,那將是有用的。 我可以在我的POI類中添加另一個var。

編輯:我嘗試了一個用戶在他的答案中說,並通過給出異常崩潰:System.Xml.Linq.ni.dll中發生System.ArgumentNullException ...我添加修改后的代碼:

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");

您的原始代碼也無法檢索其他信息(名稱,描述,縮略圖等),因為這些數據實際上都不存儲在屬性中。 這些都包含在元素中,而不是屬性中,並且在查詢它們時還需要指定正確的命名空間(請參閱上面的示例中的命名空間)。 最后,請注意緯度,經度,縮略圖和網址數據包含在子元素中。 您必須獲取信息和Point元素才能查詢它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM