2013-05-08 59 views
2

我使用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

回答

3

您已定義的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

1

因爲你的第一個temp_el

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

您曾經獲得不被視爲x_element元素的節點。

它被視爲根。然而,第二個,

x_element.DescendantsAndSelf()` 

您使用該XElement方法,把節點自身作爲元素。

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

XElement.DescendantsAndSelf Method - 返回包含該元素的元素,而這種元素的所有後代元素的集合,按文檔順序。