2015-06-20 80 views
0

與該XML數據:迭代XML LINQ查詢時訪問嵌套元素?

<item> 
    <placemarks> 
    <placemark> 
     <uid>{EA5FA2B2-78CB-4FAA-9F17-EBB361410499}</uid> 
    </placemark> 
    </placemarks> 
    <links> 
    <link> 
     <title>Book Online</title> 
     <link>https://blah</link> 
    </link> 
    <link> 
    <title>Call to Book</title> 
    <link>tel:1-866-555-5555</link> 
    </link> 
</links> 
</item> 

我試圖創建對象酒店W從XML /各種屬性。一切工作正常,直到我打嵌套的XML標記,然後我就死:

var items = root.Descendants ("item"); 
var hotels = from it in items 
     select new Hotel() { 
       Uid = it.Element ("uid").Value, 
       Name = it.Element ("name").Value, 
       Description = it.Element ("description").Value, 
       ImageUrl = it.Element ("image_url").Value, 
       RoomType = it.Element("custom_1").Value, 
       PlacemarkId = it.Element("placemarks").Element("placemark").Element("uid").Value, 
       BookUrl = (from links in it.Descendents("links") where links.Element("link").Element("title) = "Book Online").Value 
      }; 

我怎麼PlacemarkId工作?我一直收到null,因爲第一個元素(「地標」)之後的方法顯然失敗:-( 顯然,設置BookUrl屬性不會編譯,但這就是我想要做的。奇怪的XML模式瓦特/嵌套鏈接標籤:-(

對不起,noob問題。我試着谷歌搜索每個組合的「嵌套xml linq選擇」我可以想到瓦特/沒有運氣:-P 會幫助更多如果有人可以讓我知道我想要做的就是所謂的LINQ。我認爲這是可能的...

在此先感謝:-)

+0

使用後代( 「UID」)我而不是Element()。 – jdweng

+0

因此,爲了使事情複雜化,直接在它下面有一個標記(我嘗試顯示xml文檔的子集)。如果我使用了後代(「uid」),它就選擇了第一個(它進入了Hotel的Uid屬性)。 – kenyee

+0

顯示完整的.xml文件 –

回答

2

您可以使用XPathSelectElement()分機ension方法,以避免在殼體一些<item>沒有placemark子(而不必手動檢查從C#代碼空值)空引用異常:

var hotels = from it in items 
     select new Hotel() 
     { 
      ...... 
      ...... 
      PlacemarkId = (string)it.XPathSelectElement("placemarks/placemark/uid"), 
      BookUrl = (string)it.XPathSelectElement("links/link[title='Book Online']/link"), 
     }; 

入門BookUrl值還可以使用XPath如上所示進行。或者,如果你是確保XML的結構是這一部分(沒有元素正在不斷丟失)保持一致,你可以使用LINQ沒有空檢查,像這樣:

BookUrl = (from link in it.Elements("links").Elements("link") 
      where (string)link.Element("title") == "Book Online" 
      select link.Element("link")).First().Value 

參考:

+0

沒有意識到你可以將XPath與LINQ-XML混合使用。謝謝! :-) – kenyee