我希望你们能够帮助我吗?
我有这种XML结构:
<DataBase
xsi:schemaLocation="http://somestuff.new/xml http://somestuff.xsd"
xmlns:ns3="http://somestuff.new/ns3"
xmlns:ns2="http://somestuff.new/ns2"
xmlns="http://somestuff.new/ns"
xmlns:xsi="http://somestuff.new/XMLScema-instance"
xmlns:ns4="http://somestuff.new/ns4">
<Cars>
<SmallCars attribute="Something">
<Id>licenceplate</Id>
<Parts attribute="All Parts">
<Extras>
<Gauges xmlns="http://somestuff.new/ns3">
<Speed>100</Speed>
<Rpm>3200</Rpm>
</Gauges>
</Extras>
</Parts>
</SmallCars>
</Cars>
</DataBase>
然后我创建了一类这样的汽车:
public class Cars
{
public string CarType { get; set; }
public List<Parts> CarParts { get; set; }
}
和一类零件:
public class Parts
{
public List<Gauges> CarExtras { get; set; }
}
最后但并非最不重要的是一类仪表:
public class Gauges
{
public double Speed { get; set; }
public int Rpm { get; set; }
}
现在我想创建一个LINQ查询,该查询从XML的Gauges部分获取值,但我的尝试似乎失败了:
XDocument xml = XDocument.Load(file);
XNamespace xmlns =XNamespace.Get("http://somestuff.new/ns");
XNamespace ns3 = XNamespace.Get("http://somestuff.new/ns3");
var Cars = from car in xml.Descendants(ns + "Cars")
select new Cars
{
CarParts = (from part in car.Descendants(ns + "Parts")
select new Parts
{
CarExtras = (from extra in part.Descendants(ns + "Extras")
select new Gauges
{
Speed = (double?)extra.Element(ns3 + "Speed") ?? 0.0,
Rpm = (int?)extra.Element(ns3 + "Rpm") ?? 0
})
})
});
我已经尝试了很多与命名空间的组合,因为当我到达Gauges时它会改变,但是我没有得到任何值。
希望有人可以帮助我吗?
答案 0 :(得分:1)
请注意,您的linq-to-xml代码中的extra
是<Extras>
元素,因为<Speed>
和<Rpm>
不是<Extras>
的直接子代您无法使用extra.Element(ns3 + "elementName")
选择其中任何一个。在这种情况下,您可以使用Descendants
代替Element
:
XNamespace ns =XNamespace.Get("http://somestuff.new/ns");
XNamespace ns3 = XNamespace.Get("http://somestuff.new/ns3");
var Cars = from car in xml.Descendants(ns + "Cars")
select new Cars
{
CarParts = (from part in car.Descendants(ns + "Parts")
select new Parts
{
CarExtras =
(from extra in part.Descendants(ns + "Extras")
select new Gauges
{
Speed =
(double?)
extra.Descendants(ns3 + "Speed").FirstOrDefault() ??
0.0,
Rpm =
(int?)
extra.Descendants(ns3 + "Rpm").FirstOrDefault() ?? 0
}).ToList()
}).ToList()
};