2015-12-07 2 views
1

Я просматриваю файл xml. Это образец.Как искать значения вложенных элементов в 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"); 

затем getneededData дает только данные, где Name == "some value". Я хочу посмотреть даты, где Date ="some date". как я могу сделать это напрямую, как для Name?

+0

Вы хотите сделать это в том же пункте'Where', например, где имя равно 'некоторым name' И равна «некоторой дате». Или, может быть, вы хотите найти все элементы 'CruiseProduct', которые содержат' some date'? –

+0

Вы пробовали что-то похожее: var query = rootele.Descendants («Отправление») . Где (x => ((DateTime) x.Element («Дата»)). Год == 1998 && ((DateTime) x. Элемент («Дата»)). Месяц == 2) .ToList(); – Fragment

+0

Да, я хочу сделать это в том же месте Где предложение @Sergii –

ответ

0

Просто добавьте или условие, включая 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); 
+0

это нормально, но это происходит только через первый элемент в каждой «Доступности», и я хочу пройти все даты. –

+0

. Какое условие вы бы применили в списке дат? – Ksv3n

+0

Я хочу проверить доступность запрашиваемой даты, проверив все даты. (название и другие две вещи тоже такие.). то, должен вернуть информацию в соответствии с запрашиваемой датой, именем и т. д .... –

0

Ваш 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> 

Предполагая, что вы можете найти продукт с "Name", как

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))); 

использовать || или && в зависимости от того, что служит вашей цели.

0

Это то, что я сделал, и это работает для меня ....

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")));