通过id linq到xml C#选择一个对象

时间:2017-04-15 14:37:20

标签: c# .net xml linq

我正在使用linq转换为xml。我有 xml 文件,我想阅读它,选择对象(自行车) ID 。 我的测试xml文件是:

<Bikes>
<!--- - - - - - - - - - - - - - - - - - - -A new Bike- - - - - - - - - - - - - - - - - - - -->
    <Bike Id="1">
      <Big_Picture>Image</Big_Picture>
      <Small_Picture>Image</Small_Picture>
      <Emblem_Picture>Image</Emblem_Picture>
      <Firm>Image</Firm>
      <Model>Image</Model>
      <Price>Image</Price>
      <Colour>Image</Colour>
      <Frame_Size>Image</Frame_Size>
      <Description>Image</Description>
      <Gears>Image</Gears>
      <Groupset>Image</Groupset>
      <Brakes>Image</Brakes>
      <Frame_Material>Image</Frame_Material>
      <Wheel>Image</Wheel>
    </Bike>
</Bikes>

我想通过 id(1)选择这个自行车,然后将这辆自行车的元素放在我的类(自行车)的对象中。我怎样才能做到这一点?当然,我的代码不执行任务:

XDocument xdoc = XDocument.Load("Bikes.xml");
xdoc.Descendants("Bike").Select(p => new {
        id = p.Attribute("Id").Value,
        picture = p.Element("Small_Picture").Value,
        model = p.Element("Model").Value,
        price = p.Element("Price").Value
    }).ToList().ForEach(p => {
        Bike bike = new Bike(p.id, p.picture, p.model, p.price);//Constructor
        bikes_xml.Add(bike);
    });

2 个答案:

答案 0 :(得分:1)

如果无法正常工作您的意思是获得了所有项目,那么您只需要Where

var bikes =  xdoc.Descendants("Bike")
                 .Where(e => (int)e.Attribute("Id") == 1)
                 .Select(p => new
                 {
                     id = p.Attribute("Id").Value,
                     picture = p.Element("Small_Picture").Value,
                     model = p.Element("Model").Value,
                     price = p.Element("Price").Value
                 }).ToList();

如果您尚未使用属性,则可以将类更改为使用属性,因此您不需要创建匿名类型。您可以使用new Bike { ... }

答案 1 :(得分:0)

如果您想在问题中检索一辆自行车,请使用FirstOrDefault

var data = XDocument.Load("data.xml")
                    .Descendants("Bike")
                    .FirstOrDefault(item => item.Attribute("Id").Value == "1");
if(data != null)
{
    Bike bike = new Bike(data.Attribute("Id").Value,
                         data.Element("Small_Picture").Value,
                         data.Element("Model").Value,
                         data.Element("Price").Value);
}

如果你想用linq语法构造它,那么:

Bike x = (from bike in XDocument.Load("data").Descendants("Bike")
          select new Bike(bike.Attribute("Id").Value, 
                          bike.Element("Small_Picture").Value, 
                          bike.Element("Model").Value, 
                          bike.Element("Price").Value))
         .FirstOrDefault(item => item.Id == 1);    

正如@SelmanGenç所建议的,看看你是否可以改为使用Object Initializer而不是带参数的构造函数。有关详情,请查看What's the difference between an object initializer and a constructor?