选择节点值并选择最大值
本文关键字:选择 最大值 节点 | 更新日期: 2023-09-27 17:53:21
我想从每个"temp"产品的所有Detail标签中选择"最高"Depth、Width和Height值。
下面是我的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"));
但我真的不知道为什么这不起作用,最大深度总是0。最大深度。。。必须为每个选择,而不是为所有选择
你有什么想法吗?
更新完整的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>
您必须使用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")));
您的代码总是返回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();
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")));