如何在XML中搜索嵌套的元素值

本文关键字:嵌套 元素 搜索 XML | 更新日期: 2023-09-27 18:26:00

我浏览了一个xml文件。这是它的一个样本。

<Cproducts>
   <ID>id_one</ID>
   <Name>name_one</Name>
   <Availability>
        <Departure>
          <Date>2015-12-03T00:00:00.0000000+00:00</Date>
        </Departure>
        <Departure>
          <Date>2015-12-06T00:00:00.0000000+00:00</Date>
        </Departure>
    <Availability>
    <ID>id_two</ID>
   <Name>name_two</Name>
   <Availability>
        <Departure>
          <Date>2015-12-03T00:00:00.0000000+00:00</Date>
        </Departure>
        <Departure>
          <Date>2015-12-03T00:00:00.0000000+00:00</Date>
        </Departure>
        <Departure>
          <Date>2015-12-07T00:00:00.0000000+00:00</Date>
        </Departure>
        <Departure>
          <Date>2015-12-08T00:00:00.0000000+00:00</Date>
        </Departure>
    <Availability>
 </Cproducts>   

我像这样直接搜索名字。

 var getneededData = rootele.Elements("CruiseProduct")
                                .Where(l => l.Element("Name").Value == "some value");

则CCD_ 1仅给出其中CCD_。我想浏览一下Date ="some date"所在的日期。我怎么能像Name那样直接做到这一点?

如何在XML中搜索嵌套的元素值

只需添加一个或条件,包括date元素

var anotherDate = DateTime.Now ; 
var getneededData = rootele.Elements("CruiseProduct")
           .Where(l => l.Element("Name").Value == "some value" || DateTime.ParseExact(l.Descendants("Date").First().Value, "o") == anotherDate);

您的XML与您的代码不匹配。我假设你的XML看起来像这个

<?xml version="1.0" encoding="UTF-8" ?>
<Cproducts>
    <CruiseProduct>
        <ID>id_one</ID>
        <Name>name_one</Name>
        <Availability>
            <Departure>
                <Date>2015-12-03T00:00:00.0000000+00:00</Date>
            </Departure>
            <Departure>
                <Date>2015-12-06T00:00:00.0000000+00:00</Date>
            </Departure>
        </Availability>
    </CruiseProduct>
    <CruiseProduct>
        <ID>id_two</ID>
        <Name>name_two</Name>
        <Availability>
            <Departure>
                <Date>2015-12-03T00:00:00.0000000+00:00</Date>
            </Departure>
            <Departure>
                <Date>2015-12-03T00:00:00.0000000+00:00</Date>
            </Departure>
            <Departure>
                <Date>2015-12-07T00:00:00.0000000+00:00</Date>
            </Departure>
            <Departure>
                <Date>2015-12-08T00:00:00.0000000+00:00</Date>
            </Departure>
        </Availability>
    </CruiseProduct>
</Cproducts>   

假设这样,你可以找到一个"名称"为的产品

var name_one_product = xDoc.Descendants("CruiseProduct")
                           .Where(cp => cp.Element("Name").Value == "name_one");

并以"日期"作为

var date = new DateTime(2015, 12, 7);
var product_2015_12_07 = xDoc.Descendants("CruiseProduct")
                             .Where(cp => cp.Descendants("Date")
                                            .Any(d => DateTime.Parse(d.Value).Date.Equals(date.Date)));

如果你想要这两种条件,那么

var date = new DateTime(2015, 12, 7); //the date on which you want to filter
var product_2015_12_07 = xDoc.Descendants("CruiseProduct")
                                .Where(cp => cp.Element("Name").Value == "name_one" ||
                                             cp.Descendants("Date")
                                               .Any(d => DateTime.Parse(d.Value).Date.Equals(date.Date)));

使用||&&,以达到您的目的为准。

这就是我所做的,这对我有效…

 var getneededData = rootele.Elements("CruiseProduct")
                                .Where(l => l.Element("Location").Value == "some destination" && l.Element("Types").Element("Type").Value == "some type" && l.Descendants("Date").Any(d=> d.Value.Substring(0,10).Equals("some date")));
相关文章: