在迭代 XML LINQ 查询时访问嵌套元素?
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 的各种属性的酒店对象。一切正常,直到我点击嵌套的 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 属性 不会编译,但这就是我想做的。它真的很难看,因为带有嵌套 link 标签的奇怪 XML 模式 :-(
抱歉这个菜鸟问题。我尝试用谷歌搜索我能想到的 "nested xml linq select" 的每个组合,但是运气不好 :-P
如果有人可以让我知道我正在尝试做的事情在 LINQ 中被调用,将会更有帮助。我认为这是可能的...
提前致谢:-)
您可以使用 XPathSelectElement()
扩展方法来避免空引用异常,以防某些 <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
供参考:
- W3C:XML Path Language (XPath) Version 1.0 specification(xpath 的正式和完整规范)
- w3schools : XPath syntax(基本 xpath 语法的轻松介绍)
有了这个 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 因为第一个 Element("placemarks") 之后的方法显然失败了:-( 显然,设置 BookUrl 属性 不会编译,但这就是我想做的。它真的很难看,因为带有嵌套 link 标签的奇怪 XML 模式 :-(
抱歉这个菜鸟问题。我尝试用谷歌搜索我能想到的 "nested xml linq select" 的每个组合,但是运气不好 :-P 如果有人可以让我知道我正在尝试做的事情在 LINQ 中被调用,将会更有帮助。我认为这是可能的...
提前致谢:-)
您可以使用 XPathSelectElement()
扩展方法来避免空引用异常,以防某些 <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
供参考:
- W3C:XML Path Language (XPath) Version 1.0 specification(xpath 的正式和完整规范)
- w3schools : XPath syntax(基本 xpath 语法的轻松介绍)