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

时间:2014-07-21 15:55:33

标签: c# xml linq

我没有从下面的代码中得到我的期望。我有很多“VectorScaleRange”元素。我想获得所有这些元素,并且对于每个元素,我想获得名为“MaxScale”和“MinScale”的嵌套元素。问题是在每个周期我得到xElmVectorScaleRange的值“151”,我得到xElmMinScale和xElmMaxScale的空元素

对于什么是错的任何想法?...

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());
        }
    }

2 个答案:

答案 0 :(得分:2)

更改此

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

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

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

答案 1 :(得分:1)

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

您正在循环浏览VectorScaleRange内的elements(即xElmVectorScaleRange每个MinMaxScale),当您似乎想要循环遍历VectorScaleRange s本身。然后,您的代码会查找具有正确名称的元素的后代,并找不到(所有null s)。

似乎最多只有一个后代是MinMaxScale,并且始终是一个直接的后代,所以ElementDescendants更有意义。< / p>

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