2015-12-07 2 views
3

Это мой XML-канал. Это больше, чем это.Как выполнить поиск по всем элементам в XML

<Cproducts> 
    <ID>001</ID> 
    <Name>name one</Name> 
    <Availability> 
     <Departure> 
      <Date>2015-12-03T00:00:00.0000000+00:00</Date> 
      <Pricing> 
      <Price> 
       <Type>ADT</Type> 
       <Value>175.00</Value> 
       <Qty>20</Qty> 
      </Price> 
      <Price> 
       <Type>CHD</Type> 
       <Value>95.00</Value> 
       <Qty>5</Qty> 
      </Price> 
      <Price> 
       <Type>INF</Type> 
       <Value>0.00</Value> 
       <Qty>5</Qty> 
      </Price> 
      <Price> 
       <Type>FAM</Type> 
       <Value>0.00</Value> 
       <Qty>0</Qty> 
      </Price> 
      <Price> 
       <Type>SEN</Type> 
       <Value>175.00</Value> 
       <Qty>20</Qty> 
      </Price> 
      </Pricing> 
     </Departure> 
     <Departure> 
      <Date>2015-12-06T00:00:00.0000000+00:00</Date> 
      <Pricing> 
      <Price> 
       <Type>ADT</Type> 
       <Value>175.00</Value> 
       <Qty>20</Qty> 
      </Price> 
      <Price> 
       <Type>CHD</Type> 
       <Value>95.00</Value> 
       <Qty>5</Qty> 
      </Price> 
      <Price> 
       <Type>INF</Type> 
       <Value>0.00</Value> 
       <Qty>5</Qty> 
      </Price> 
      <Price> 
       <Type>FAM</Type> 
       <Value>0.00</Value> 
       <Qty>0</Qty> 
      </Price> 
      <Price> 
       <Type>SEN</Type> 
       <Value>175.00</Value> 
       <Qty>20</Qty> 
      </Price> 
      </Pricing> 
     </Departure> 
    <Availability> 
</Cproducts> 

В моем случае я хочу, чтобы пройти через все имеющиеся dates.that означает, когда пользователь выбирает дату [из формы], то в соответствии с этой датой, другие данные должны provide.to делать, что я должен смотреть через все доступные даты. Как я могу это сделать. это мой код в MVC.

public void getDatas(string destination, string cruisetype, string datetime) 
{ 
    XElement rootele = XElement.Load(Server.MapPath("~/XmlFiles/CruiseData/cruiseprodutstwo.xml")); 

    var selecttoDate = rootele.Elements("Cproducts").Elements("Availability").Elements("Departure").Elements("Date"); //here I want to get the data that the [date == datetime] 
+0

честно, я не понимаю, почему этот вопрос получает три upvotes :-( –

+0

Можете ли вы сказать мне, есть прямой путь, чтобы посмотреть, что конкретный датой является следующий. 'var getneededData = rootele.Elements (" CruiseProduct ") . Где (l => l.Element (" Location "). Значение == destination);' используя это мы можем проверить весь документ и получить данные о том, что местоположение равно заданной строке. Например, я хочу выполнить поиск по w . Есть ли способ сделать это mr @Uwe Keim. помоги мне с этим сэром. –

ответ

1

Вы, вероятно, может создать seralization для XML, как этот

[XmlRoot(ElementName="Price")] 
public class Price { 
    [XmlElement(ElementName="Type")] 
    public string Type { get; set; } 
    [XmlElement(ElementName="Value")] 
    public string Value { get; set; } 
    [XmlElement(ElementName="Qty")] 
    public string Qty { get; set; } 
} 

[XmlRoot(ElementName="Pricing")] 
public class Pricing { 
    [XmlElement(ElementName="Price")] 
    public List<Price> Price { get; set; } 
} 

[XmlRoot(ElementName="Departure")] 
public class Departure { 
    [XmlElement(ElementName="Date")] 
    public string Date { get; set; } 
    [XmlElement(ElementName="Pricing")] 
    public Pricing Pricing { get; set; } 
} 

[XmlRoot(ElementName="Availability")] 
public class Availability { 
    [XmlElement(ElementName="Departure")] 
    public List<Departure> Departure { get; set; } 
} 

[XmlRoot(ElementName="Cproducts")] 
public class Cproducts { 
    [XmlElement(ElementName="Availability")] 
    public Availability Availability { get; set; } 
} 

что принесет пользу вам получить ObservableCollection объектов для вашего XML и это было бы гораздо проще для запроса любых сложных данных, а также , Итак, в текущем сценарии.

После Сериализации вы можете создать ObservableCollection Cproducts и затем выполнить запрос с помощью LINQ.

ObservableCollection<Cproducts> ResultantCollection = new ObservableCollection<Cproducts>(); 
if(File.Exists(path + "\\YourXML.xml")) 
{ 
    XElement root = XElement.Load(path + "\\YourXML.xml"); 
    root.Element("Cproducts").Elements("Availability").All<XElement>(xe => 
    { 
     ResultantCollection.AddAvailability(Availability av); 
     return true; 
    }); 

Класс будет определяться как этот

public class CproductsColl : ObservableCollection<Cproducts> 
{ 
    public User AddAvailability(Availability av) 
    { 
     base.Add(av); 
     return av; 
    } 
}  
+0

приятная и хорошая работа –

+0

Если все в порядке, можете ли вы показать мне, как создать ObservableCollection of Cproducts. потому что я новичок в этом feild –

+0

У меня нет идеи идти вперед, добавить ли я в список или что. помогите мне с этим @Mohit –

1
static void Main(string[] args) 
    { 
     string xml = @"<Cproducts> 
<Availability> 
     <Departure> 
      <Date>2015-12-03T00:00:00.0000000+00:00</Date> 
      <Pricing> 
      <Price> 
       <Type>ADT</Type> 
       <Value>175.00</Value> 
       <Qty>20</Qty> 
      </Price> 
      <Price> 
       <Type>CHD</Type> 
       <Value>95.00</Value> 
       <Qty>5</Qty> 
      </Price> 
      <Price> 
       <Type>INF</Type> 
       <Value>0.00</Value> 
       <Qty>5</Qty> 
      </Price> 
      <Price> 
       <Type>FAM</Type> 
       <Value>0.00</Value> 
       <Qty>0</Qty> 
      </Price> 
      <Price> 
       <Type>SEN</Type> 
       <Value>175.00</Value> 
       <Qty>20</Qty> 
      </Price> 
      </Pricing> 
     </Departure> 
     <Departure> 
      <Date>2015-12-06T00:00:00.0000000+00:00</Date> 
      <Pricing> 
      <Price> 
       <Type>ADT</Type> 
       <Value>175.00</Value> 
       <Qty>20</Qty> 
      </Price> 
      <Price> 
       <Type>CHD</Type> 
       <Value>95.00</Value> 
       <Qty>5</Qty> 
      </Price> 
      <Price> 
       <Type>INF</Type> 
       <Value>0.00</Value> 
       <Qty>5</Qty> 
      </Price> 
      <Price> 
       <Type>FAM</Type> 
       <Value>0.00</Value> 
       <Qty>0</Qty> 
      </Price> 
      <Price> 
       <Type>SEN</Type> 
       <Value>175.00</Value> 
       <Qty>20</Qty> 
      </Price> 
      </Pricing> 
     </Departure> 
    </Availability> 
</Cproducts>"; 

     XDocument doc = XDocument.Parse(xml); 

     var list = (from element in doc.Elements("Cproducts").Elements("Availability").Elements("Departure") 
        where Convert.ToDateTime(element.Element("Date").Value) < DateTime.Now 
        select element).ToList(); 

     foreach(XElement el in list) 
     { 
      Console.WriteLine(el.Element("Date").Value); 
     } 

    } 

Это не понятно, что именно вы хотите сделать. Поэтому я написал вам способ выбрать даты из вашего xml, где они находятся < с сегодняшнего дня. В вашем случае вы не должны использовать XDocument.Parse, вам нужно XDocument.Load(uri). Также в следующий раз, по крайней мере, попробуйте добавить действительный xml.

Смежные вопросы