我正在使用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);
});
答案 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?