繁体   English   中英

在迭代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创建带有各种属性的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM