如何搜索XML中的所有元素

时间:2015-12-07 04:25:17

标签: c# xml

这是我的XML Feed。它不止于此。

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

在我的情况下,我想查看所有可用的日期。这意味着当用户从[表单]中选择日期时,然后根据该日期,应提供其他数据。为此,我必须查看所有可用日期。我怎样才能做到这一点。 这是我在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]

2 个答案:

答案 0 :(得分: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中选择日期的方法&lt;从今天开始。在您的情况下,您不应使用XDocument.Parse,而是需要XDocument.Load(uri)。另外下次至少尝试添加有效的xml。

答案 1 :(得分:1)

您可以像这样为

创建XML的seralization
imJPG2 = jpeg_read('foto2.jpg');
lum = imJPG2.coef_arrays{imJPG2.comp_info(1).component_id};
for i = 1:8
     for j = 1:8
        r = lum( i:8:end, j:8:end );
        histogram(r(:), 'binmethod','integers');
        pause();
    end
end

为您的XML获取Objects的ObservableCollection会对您有所帮助,并且查询任何复杂数据也会更加容易。所以在当前的情况下。

您可以在序列化后创建[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,然后可以使用LINQ进行查询。

Cproducts

该类将按此定义

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