2015-06-20 45 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