查询嵌套XML中的项目

时间:2013-02-06 06:59:19

标签: c# xml xml-parsing

我有以下XML:

<Vehicle>
  <Car>
    <Name>Audi</Name>
    <ModelList>
      <Model>A3</Model>
      <Model>A5</Model>
      <Model>A7</Model>
    </ModelList>
  </Car>
  <Car>
    <Name>Benz</Name>
    <ModelList>
      <Model>C Class</Model>
      <Model>E Class</Model>
      <Model>S Class</Model>
    </ModelList>
  </Car>
</Vehicle>

由此,我如何获得汽车名称“奥迪”的不同型号?

我尝试了以下内容:

var h = from c in load.Descendants("Vehicle") 
        select new { model = c.Descendants("Car").Elements("ModelList").ToArray() };

但这给了我“奥迪”和“奔驰”的所有型号。我在哪里可以通过这里的汽车名称?

2 个答案:

答案 0 :(得分:3)

您只需要一个Where子句或First(或类似的东西)来执行过滤。

如果您知道只有一辆车的名称正确,您可以使用Single

var models = load.Descendants("Car")
                 .Single(x => (string) x.Element("Name") == "Audi")
                 .Element("ModelList")
                 .Elements("Model")
                 .Select(x => (string) x);

或者,如果您不知道是否可能有多个这样的元素(或者没有),并且您对所有名为奥迪的汽车的所有型号列表感到满意:

var models = load.Descendants("Car")
                 .Where(x => (string) x.Element("Name") == "Audi")
                 .SelectMany(x => x.Element("ModelList").Elements("Model"))
                 .Select(x => (string) x);

查询表达式中的后一版本:

var models = from x in load.Descendants("Car")
             where (string) x.Element("Name") == "Audi"
             from model in x.Element("ModelList").Elements("Model")
             select (string) model;

答案 1 :(得分:1)

使用Linq to Sql:

XDocument doc = XDocument.Load("XMLFilePath");
var selectors3 = (from elements in doc.Element("Vehicle").Elements("Car")
                  where elements.Element("Name").Value == "Audi"
                  from items in elements.Element("ModelList").Elements("Model")
                  select items.Value).ToList();