选择节点值并选择最大值

时间:2015-06-04 08:02:10

标签: c# xml linq

我想选择"最高"每个" 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>

3 个答案:

答案 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();