在循环访问 XML LINQ 查询时访问嵌套元素

本文关键字:访问 嵌套 查询 元素 LINQ 循环 XML | 更新日期: 2023-09-27 17:57:25

使用此 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
            };

如何让地标 ID 工作? 我一直得到空,因为第一个元素("地标")之后的方法显然失败了:-(显然,设置 BookUrl 属性不会编译,但这就是我想做的。 这真的很丑陋,因为带有嵌套链接标签的奇怪 XML 模式:-(

对不起菜鸟问题。 我尝试在谷歌上搜索我能想到的每个"嵌套 xml linq 选择"组合,但没有运气:-P如果有人可以让我知道我在 LINQ 中调用我正在尝试执行的操作,将提供更多帮助。 我认为这是可能的...

提前感谢:-)

在循环访问 XML 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 完成,如上所述。或者,如果您确定此部分的 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 路径语言 (XPath) 版本 1.0 规范(xpath 的正式和完整规范)
  • w3schools : XPath 语法(基本 XPath 语法的轻松介绍)