XElement.Descendant似乎没有得到正确的元素

本文关键字:元素 Descendant XElement | 更新日期: 2023-09-27 18:14:00

我没有从下面的代码中得到我所期望的。我有很多"VectorScaleRange"的元素。我想得到所有这些元素,对于每一个元素,我想得到名为"MaxScale"answers"MinScale"的嵌套元素。问题是,在每个循环中,我都会得到xElmVectorScaleRange的值"151",而xElmMinScale和xElmMaxScale 的元素为null

知道怎么了吗?。。。

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            StringBuilder strXml= new StringBuilder();
            strXml.AppendLine("<?xml version='1.0'?>");
            strXml.AppendLine("<LayerDefinition xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' version='1.3.0' xsi:noNamespaceSchemaLocation='LayerDefinition-1.3.0.xsd'>");
            strXml.AppendLine("  <VectorLayerDefinition>");
            strXml.AppendLine("    <VectorScaleRange>");
            strXml.AppendLine("      <MaxScale>151</MaxScale>");
            strXml.AppendLine("      <MinScale>0</MinScale>");
            strXml.AppendLine("    </VectorScaleRange>");
            strXml.AppendLine("    <VectorScaleRange>");
            strXml.AppendLine("      <MaxScale>222</MaxScale>");
            strXml.AppendLine("      <MinScale>0</MinScale>");
            strXml.AppendLine("    </VectorScaleRange>");
            strXml.AppendLine("  </VectorLayerDefinition>");
            strXml.AppendLine("</LayerDefinition>");
            XDocument xDoc = XDocument.Parse(strXml.ToString());                
            //get all vector scale ranges  
            foreach (XElement xElmVectorScaleRange in xDoc.Descendants("VectorScaleRange").Elements())
            {
                //check for scale
                XElement xElmMinScale = xElmVectorScaleRange.Descendants("MinScale").FirstOrDefault();
                XElement xElmMaxScale = xElmVectorScaleRange.Descendants("MaxScale").FirstOrDefault();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

XElement.Descendant似乎没有得到正确的元素

更改此

foreach (XElement xElmVectorScaleRange in xDoc.Descendants("VectorScaleRange").Elements())

foreach (XElement xElmVectorScaleRange in xDoc.Descendants("VectorScaleRange"))

Descendants方法已经为您提供了所需的元素,但您正在调用Descendants().Elements(),这将导致返回VectorScaleRange中的元素。这里没有其他级别的嵌套,所以当您调用xElmVectorScaleRange.Descendants("MinScale")时,显然会得到null

...in xDoc.Descendants("VectorScaleRange").Elements())

当您似乎想要循环遍历VectorScaleRanges本身时,您正在循环遍历VectorScaleRanges内部的元素(即xElmVectorScaleRange分别是MinMaxScale(。然后,您的代码会查找那些具有正确名称的元素的后代,但没有找到任何元素(全部为null(。

而且,似乎最多会有一个MinMaxScale的后代,并且总是一个直系后代,因此ElementDescendants更有意义。

foreach (XElement xElmVectorScaleRange in xDoc.Descendants("VectorScaleRange"))
{
    //check for scale
    XElement xElmMinScale = xElmVectorScaleRange.Element("MinScale");
    XElement xElmMaxScale = xElmVectorScaleRange.Element("MaxScale");
}