我没有从下面的代码中得到我期望的结果。我有很多"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());
}
}发布于 2014-07-22 00:05:10
改变这一点
foreach (XElement xElmVectorScaleRange in xDoc.Descendants("VectorScaleRange").Elements())至
foreach (XElement xElmVectorScaleRange in xDoc.Descendants("VectorScaleRange"))Descendants方法已经为您提供了所需的元素,但是您调用的是Descendants().Elements(),这将导致在VectorScaleRange中返回元素。而且这里没有其他级别的嵌套,所以很明显,当你调用xElmVectorScaleRange.Descendants("MinScale")时,你会得到null。
发布于 2014-07-22 00:05:46
...in xDoc.Descendants("VectorScaleRange").Elements())当您似乎想遍历VectorScaleRange本身时,您正在遍历VectorScaleRanges中的elements (即,xElmVectorScaleRange是每个Min和MaxScale)。然后,您的代码查找具有正确名称的这些元素的后代,但找不到(全部为null)。
而且看起来最多只能有一个Min或MaxScale的后代,而且始终是直系后代,所以Element比Descendants更有意义。
foreach (XElement xElmVectorScaleRange in xDoc.Descendants("VectorScaleRange"))
{
//check for scale
XElement xElmMinScale = xElmVectorScaleRange.Element("MinScale");
XElement xElmMaxScale = xElmVectorScaleRange.Element("MaxScale");
}https://stackoverflow.com/questions/24869387
复制相似问题