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());
}
}
更改此
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())
当您似乎想要循环遍历VectorScaleRange
s本身时,您正在循环遍历VectorScaleRange
s内部的元素(即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");
}