[英]Accessing nested elements while iterating an XML LINQ query?
使用此XML数据:
<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>
我正在尝试使用XML创建带有各种属性的Hotel对象。 一切正常,直到我打了嵌套的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,因为第一个Element(“ placemarks”)之后的方法显然失败了:-(而且,显然,设置BookUrl属性不会编译,但这是我想做的。由于怪异,这确实很丑陋带嵌套链接标记的XML模式:-(
对不起,菜鸟问题。 我尝试过搜索“嵌套xml linq select”的每个组合,我想起来可能没有运气:-P如果有人可以让我知道我要执行的操作在LINQ中可以提供更多帮助。 我认为有可能...
提前致谢 :-)
您可以使用XPathSelectElement()
扩展方法来避免null引用异常,以防某些<item>
没有placemark
子(不必从C#代码中手动检查null):
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来获取BookUrl
值。 或者,如果您确定此部分的XML结构是一致的(不会丢失任何元素),则可以使用LINQ而不进行null检查,如下所示:
BookUrl = (from link in it.Elements("links").Elements("link")
where (string)link.Element("title") == "Book Online"
select link.Element("link")).First().Value
以供参考 :
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.