使用此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创建具有各种属性的酒店对象。一切正常,直到我点击嵌套的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因为第一个元素之后的方法(&#34;地标&#34;)明显失败:-( 显然,设置BookUrl属性不会编译,但这就是我想做的事情。由于带有嵌套链接标记的奇怪XML模式,它真的很难看: - (
抱歉这个菜鸟问题。我尝试用谷歌搜索&#34;嵌套的xml linq select&#34;我能想到没有运气:-P 如果有人能让我知道我想要做的事情会在LINQ中调用,那会更有帮助。我认为这可能......
提前致谢: - )
答案 0 :(得分:2)
如果某些<item>
没有placemark
子级(无需手动检查C#代码中的空值),您可以使用XPathSelectElement()
扩展方法来避免空引用异常:
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"),
};
如上所示,也可以使用XPath获取BookUrl
值。或者如果你确定这个部分的XML结构是一致的(没有元素丢失),你可以使用LINQ而不进行空值检查:
BookUrl = (from link in it.Elements("links").Elements("link")
where (string)link.Element("title") == "Book Online"
select link.Element("link")).First().Value
供参考: