我没有从下面的代码中得到我的期望。我有很多“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());
}
}
答案 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
每个Min
和MaxScale
),当您似乎想要循环遍历VectorScaleRange
s本身。然后,您的代码会查找具有正确名称的元素的后代,并找不到(所有null
s)。
似乎最多只有一个后代是Min
或MaxScale
,并且始终是一个直接的后代,所以Element
比Descendants
更有意义。< / p>
foreach (XElement xElmVectorScaleRange in xDoc.Descendants("VectorScaleRange"))
{
//check for scale
XElement xElmMinScale = xElmVectorScaleRange.Element("MinScale");
XElement xElmMaxScale = xElmVectorScaleRange.Element("MaxScale");
}