2010-03-24 60 views
0

我得到了一个XML文档,其中有很多数据分为category-> subcategory。像这样:用linq-to-xml动态选择?

<?xml version="1.0" encoding="utf-8" ?> 
<data> 
    <car> 
     <transmission> 
      <option value="1" text="Manual" /> 
      <option value="2" text="Automatic" /> 
     </transmission> 
     <milage> 
      <option value="2" text="0-499" /> 
      <option value="4" text="500-999" /> 
      <option value="6" text="1000-1499" /> 
      <option value="8" text="1500-1999" /> 
      <option value="10" text="2000-2499" /> 
     </milage> 
     <fuel> 
      <option value="1" text="Gasolin" /> 
      <option value="2" text="Diesel" /> 
      <option value="3" text="E95" /> 
      <option value="4" text="Hybrid" /> 
      <option value="5" text="Electric" />    
     </fuel> 
    </car> 
</data> 

我正在使用Ajax从xml文档中检索我需要的数据。 像这样:

public string GetData(int typeOfData) 
    { 
     List<string> queryString = new List<string>(); 
     switch (typeOfData) 
     { 
      case 1: 
       // Car->Milage 
       queryString.Add("car"); 
       queryString.Add("milage"); 
       break; 
      case 2: 
       // Car-Fuel 
       queryString.Add("car"); 
       queryString.Add("fuel"); 
       break; 
     } 

     // Now i need to construct a query to return the data, i have tried something like this: 
     var results = from data in db.Elements("data") where (queryString => db.Elements(test)) select new { ID = data.Attribute("value").Value, Name = data.Attribute("text").Value }; 
    } 
} 

在XPath我可能只是简单的做一个字符串与查询,但我怎么做到这一点的LINQ?

+0

恐怕我不明白你想要做什么。你能解释一下每种情况下应该返回什么吗? – 2010-03-24 14:43:29

回答

1

可以Linq中使用XPath。

public string GetData(int typeOfData) 
{ 
    string query = null; 
    switch (typeOfData) { 
    case 1: 
     query = "/data/car/milafe/option"; 
     break; 
    case 2: 
     query = "/data/car/fuel/option"; 
     break; 
    } 

    var results = from e in db.XPathSelectElements(query) 
     select new { ID = e.Attribute("value").Value, Name = e.Attribute("text").Value }; 
} 
0

您需要遍历XML树并获得包含在switch声明的选项,这样的元素:

public string GetData(int typeOfData) 
{ 
    XElement container; 
    switch (typeOfData) 
    { 
     case 1: 
      // Car->Milage 
      container = db.Root.Element("car").Element("mileage"); 
      break; 
     case 2: 
      // Car-Fuel 
      container = db.Root.Element("car").Element("fuel"); 
      break; 
     default: 
      throw new ArugmentOutOfRangeException("typeOfData"); 
    } 

    var results = container.Elements("option") 
     .Select(data => new { ID = data.Attribute("value").Value, Name = data.Attribute("text").Value }; 
}