我想选择"最高"每个" temp"的所有Detail标签的深度,宽度和高度值。产品
这是我的XML示例:
<root>
<Temp>
<Code>1234567</Code>
<Detail>
<Depth>12.7</Depth>
<Width>1.27</Width>
<Height>15.24</Height>
</Detail>
<DetailConversion>
<Detail>
<Depth>34.925</Depth>
<Width>30.48</Width>
<Height>19.05</Height>
</Detail>
</DetailConversion>
<DetailConversion>
<Detail>
<Depth>34.925</Depth>
<Width>30.48</Width>
<Height>19.05</Height>
</Detail>
</DetailConversion>
</Temp>
<Temp>
<Code>1234567</Code>
<Detail>
<Depth>12.7</Depth>
<Width>1.27</Width>
<Height>15.24</Height>
</Detail>
<DetailConversion>
<Detail>
<Depth>34.925</Depth>
<Width>30.48</Width>
<Height>19.05</Height>
</Detail>
</DetailConversion>
<DetailConversion>
<Detail>
<Depth>34.925</Depth>
<Width>30.48</Width>
<Height>19.05</Height>
</Detail>
</DetailConversion>
</Temp>
</root>
我用
试了一下int maxDepth = doc.Root.Elements().Max(x => (int)x.Element("Depth"));
int maxWidth = doc.Root.Elements().Max(x => (int)x.Element("Width"));
int maxHeight = doc.Root.Elements().Max(x => (int)x.Element("Height"));
但我真的没有,为什么这不起作用,maxDepth总是0。 必须为每个人选择maxDepth ...而不是一起选择
你有什么想法吗?
更新完整的XML
<?xml version="1.0" encoding="utf-8"?>
<XmlInterchange xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.edi.com.au/EnterpriseService/" Version="1" >
<InterchangeInfo>
<Date>2015-05-29T14:17:45</Date>
</InterchangeInfo>
<Payload>
<Temporaer>
<Temp>
<TempCode>ST66676EU</TempCode>
<DetailConversion>
<Depth>12.7</Depth>
<Width>1.27</Width>
<Height>15.24</Height>
</DetailConversion>
<DetailConversions>
<DetailConversion>
<Depth>16.51</Depth>
<Width>13.97</Width>
<Height>6.35</Height>
</DetailConversion>
<DetailConversion>
<Depth>34.925</Depth>
<Width>30.48</Width>
<Height>19.05</Height>
</DetailConversion>
</DetailConversions>
</Temp>
</Temporaer>
</Payload>
</XmlInterchange>
答案 0 :(得分:3)
您必须使用Descendant()
来获取根的所有子节点,因为Elements()
不会获得嵌套的子节点:
int maxDepth = doc.Root.Descendants().Max(x => (int)x.Element("Depth"));
或更准确的是:
int maxDepth = doc.Root.Descendants("Detail").Max(x => (int)x.Element("Depth")));
你想得到每个Temp
节点的最大深度元素值,那么你必须这样做:
var maxDepth = doc.Root.Descendants("Detail")
.Select(x=>x.Max(y => (int)y.Element("Depth")));
或:
var maxDepth = doc.Root.Descendants("Temp")
.Select(x=>x.Descendants("Detail"))
.Select(x=>x.Max(y => (int)y.Element("Depth")));
答案 1 :(得分:2)
XNamespace ns = "http://www.edi.com.au/EnterpriseService/";
foreach (var tmp in doc.Descendants(ns + "Temp"))
{
var maxDepth = tmp.Descendants(ns + "DimensionDetails").Max(x => (decimal)x.Element(ns + "Depth"));
Console.WriteLine(maxDepth);
}
或者,如果您希望将所有结果作为序列:
var a = doc.Descendants(ns + "Temp")
.Select(e => e.Descendants(ns + "DimensionDetails").Max(x => (decimal)x.Element(ns + "Depth")));
答案 2 :(得分:2)
您的代码始终返回0
,因为没有Depth
/ Width
/ Height
直接子 <Temp>
。要获得每个<Temp>
元素的最大深度,最大宽度和最大高度,您可以尝试这种方式:
var result = doc.Root
.Elements()
.Select(o => new
{
maxDepth = o.Descendants("Depth").Max(x => (double)x),
maxWidth = o.Descendants("Width").Max(x => (double)x),
maxHeight = o.Descendants("Height").Max(x => (double)x)
})
.ToList();
result
变量将是一个匿名对象列表,每个对象都包含每个Temp
的最大值信息。
更新:
您的实际XML具有默认命名空间。您可以使用XNamespace
+ "element name"
的组合来选择命名空间中的元素:
XNamespace d = "http://www.edi.com.au/EnterpriseService/";
var result = doc.Root
.Descendants(d+"Temp")
.Select(o => new
{
maxDepth = o.Descendants(d+"Depth").Max(x => (double?)x),
maxWidth = o.Descendants(d+"Width").Max(x => (double?)x),
maxHeight = o.Descendants(d+"Height").Max(x => (double?)x)
})
.ToList();