XElement.Element为新创建的元素返回null

问题描述:

我使用XElement创建XMLDocument,它在层次结构WPF树视图中使用。如果我创建一个新的元素与:XElement.Element为新创建的元素返回null

x_element = new XElement("node", 
    new XElement("tree_id", strData[0]), 
    new XElement("sys_id", dpl.DepSysId), 
    new XElement("part_id", strData[8]), 
    new XElement("make", strData[6]), 
    new XElement("model", strData[5]), 
    new XElement("level", strData[2])); 

然后我需要添加属性“节点”,所以我尝试:

XElement temp_el = x_element.Element("node"); // This is returning null 
    temp_el.SetAttributeValue("title", strData[7] + " " + strData[6] + " " + strData[5]); 
    temp_el.SetAttributeValue("canEdit", "False"); 
    temp_el.SetAttributeValue("status", nStatus.ToString()); 
    temp_el.SetAttributeValue("qty", strData[13]); 
    temp_el.SetAttributeValue("part", strData[8]); 

在上面的代码temp_el是空的,但我可以在看调试器x_element包含以下内容:

<node> 
    <tree_id>82</tree_id> 
    <sys_id>82</sys_id> 
    <part_id>169</part_id> 
    <make>ST Panel</make> 
    <model>Logical Pure 16 tube Collector</model> 
    <level>0</level> 
</node> 

若要解决此我使用了以下内容:

foreach (XElement temp_el in x_element.DescendantsAndSelf()) 
    { 
     if (temp_el.Name == "node") 
     { 
      temp_el.SetAttributeValue("title", strData[7] + " " + strData[6] + " " + strData[5]); 
      temp_el.SetAttributeValue("canEdit", "False"); 
      temp_el.SetAttributeValue("status", nStatus.ToString()); 
      temp_el.SetAttributeValue("qty", strData[13]); 
      temp_el.SetAttributeValue("part", strData[8]); 
      break; 
     } 
    } 

虽然上述工作,我只是好奇,为什么我得到空返回。我的解决方法是做到这一点的最佳方式吗?

问候。

+0

的回答解决什么错,但最好的方法方面:对于'新XElement'构造还允许您与您已经添加了'新XElement's沿着加上'新XAttribute's 。 – AakashM 2013-05-08 08:02:06

您已定义的XElement这样的:

x_element = new XElement("node", /* child nodes */); 

哪里"node"XElement您创建,和下面的参数是其孩子的名字。

通过使用x_element.Node("node"),您试图获取名为"node"的子节点,并且没有这样的子节点。
x_element本身是名为“节点”的节点。
DescendantsAndSelf因为它包含x_element(因此称为“AndSelf”),但您不需要这个,因为您已经拥有该节点。

所以,你可以改变你的第二个代码段将:

x_element.SetAttributeValue("title", strData[7] + " " + strData[6] + " " + strData[5]); 
x_element.SetAttributeValue("canEdit", "False"); 
// etc. 

(顺便说一句,你还可以添加在构造函数中的属性)

+0

感谢您的回复和解释,它的确有助于澄清我对XElements的理解。 – SteveP 2013-05-08 08:18:45

因为你的第一个temp_el

XElement temp_el = x_element.Element("node"); 

您曾经获得不被视为x_element元素的节点。

它被视为根。然而,第二个,

x_element.DescendantsAndSelf()` 

您使用该XElement方法,把节点自身作为元素。

XContainer.Elements Method - 以文档顺序返回此元素或文档的子元素的集合。

XElement.DescendantsAndSelf Method - 返回包含该元素的元素,而这种元素的所有后代元素的集合,按文档顺序。