选择节点值并选择最大值

本文关键字:选择 最大值 节点 | 更新日期: 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")));