gpt4 book ai didi

c# - 在同一个 LINQ 查询中从不同的命名空间读取 XML 值

转载 作者:行者123 更新时间:2023-12-04 16:56:23 25 4
gpt4 key购买 nike

希望大家能帮帮我?

我有这个 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 的仪表部分获取值,但我的尝试似乎失败了:
    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 时它会发生变化,但我没有得到任何返回值。

希望有人可以帮助我吗?

最佳答案

请注意 extra在您的 linq-to-xml 代码中是 <Extras>元素,从 <Speed><Rpm>不是 <Extras> 的直接 child 您不能使用 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()
};

关于c# - 在同一个 LINQ 查询中从不同的命名空间读取 XML 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21208928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com