фильтровать xml на основе строки запроса - PullRequest
0 голосов
/ 24 декабря 2009

Я хочу отфильтровать xml на основе строки запроса

мой xml похож на это

<Categories>   
     <Category>    
       <Title>Food1<Title>  
       <Cat>Cat3</Cat>  
       <Duration>12/1/2009-12/1/2011</Duration>
       <Description>Who is hungry</Description>  
    <Category>
    <Category>    
       <Title>Food1<Title>  
       <Cat>Cat2</Cat>  
       <Duration>12/1/2009-12/1/2011</Duration>
       <Description>Who is hungry</Description>  
    <Category>
    <Category>    
       <Title>Food1<Title>  
       <Cat>Cat1</Cat>  
       <Duration>12/1/2009-12/1/2011</Duration>
       <Description>Who is hungry</Description>  
    <Category>
   <Category>    
       <Title>Food1<Title>  
       <Cat>Cat1</Cat>  
       <Duration>12/1/2009-12/1/2011</Duration>
       <Description>Who is </Description>  
    <Category>

Мне нужна фильтрация на основе строки запроса, например если

  1. ? Food = Food1 (должно отображаться все)
  2. ? Food = Food1 & Cat = Cat1 (должно отображаться в последнюю очередь 2)
  3. ? Cat = Cat1 & Description = Who is (display last1)
  4. ? Food = Food1 & Cat = Cat1 & Description = Кто голоден (3-й)

Я хочу отобразить это в повторителе. Я использую XPathIterator, чтобы выполнить итерацию и связать его с повторителем.

мой код до сих пор это

  string _Cat = HttpContext.Current.Request.QueryString["Cat"].ToString();
  string _description = HttpContext.Current.Request.QueryString["description"].ToString();
            string _food = HttpContext.Current.Request.QueryString["food"].ToString();


            XmlDocument doc = new XmlDocument();

            doc.Load("/Finder.xml");

            XPathNavigator nav = doc.CreateNavigator();



XPathExpression expression = nav.Compile("/Categories/Category[Cat='_Cat and title='_food' and Description='_description']/*");
 XPathNodeIterator iterator = nav.Select(expression);

// но это решит только случай 4) я знаю, что могу написать подобное для других трех, но я хочу, чтобы это было динамично. Как у нас это в Амазонке. Фильтр просто добавьте в соответствии с выбором, который вы делаете. Так что, возможно, нет строки запроса, может быть 1, может быть 2, поэтому мне нужно проверить это

и затем я связываю этот итератор с повторителем, используя datatable

Есть идеи, как этого добиться?

Ответы [ 2 ]

1 голос
/ 24 декабря 2009

Рассматривали ли вы использование linq, хотя я не уверен, в какой степени вы могли бы избежать повторения

XDocument xmlDoc = XDocument.Load(@"C:\so.xml");

// handle Query String variations here - this works for your first case.
List<Categories> results = (from cats in xmlDoc.Descendants("Category")
                            where cats.Element("Title").Value.ToLower() == "food1"
                            select new Categories
                            {
                                Title = cats.Element("Title").Value,
                                Cat = cats.Element("Cat").Value,
                                Duration = cats.Element("Duration").Value,
                                Description = cats.Element("Description").Value
                            }).ToList();

Затем вы можете связать список ...

Класс местодержателя для категории Тип

internal class Categories
    {
        public string Title { get; set; }
        public string Cat { get; set; }
        public string Duration { get; set; }
        public string Description { get; set; }
    }
0 голосов
/ 24 декабря 2009

Почему бы вам просто не установить серию операторов if, чтобы увидеть, какие аргументы были переданы в строке запроса, а затем сгенерировать соответствующее выражение XPath соответственно?

Что-то вроде:

string xpath = "/Categories/Category";
string predicate = "";

if (_food != "") {
    predicate += "title='" + _food + "'";
}
if (_Cat != "") {
    if (predicate!="") {
        predicate += " and ";
    }
    predicate += "Cat='" + _Cat + "'";
}
if (_Description != "") {
    if (predicate!="") {
        predicate += " and ";
    }
    predicate += "Description='" + _Description + "'";
}

if (predicate!=""){
    xpath += "[" + predicate + "]";
}
XPathExpression expression = nav.Compile(xpath);
...