2012-06-06 34 views
1

我正在製作一個小程序,該程序可以獲取只能包含值的所有XML元素。例如(請參閱下圖),<Products>雖然它是一個元素,但它不應該顯示,因爲它只包含所有其他可以包含值的元素,對於<Description>(突出顯示的那個,對不起我的英語,但希望你能給我傢伙..)如何獲取只能包含值的XML元素?

從下面的圖片,我的程序應該只挑選了以下內容:

<Material_Number> 

<Description>(2個元素,但不包括突出一個)

<Language> 
<Material_Type> 
<Base_Unit> 

我其實得到的是什麼...

enter image description here

請查看我的代碼,並建議:

public MainForm() 
     { 
      InitializeComponent(); 

      XmlDataDocument xmldoc = new XmlDataDocument(); 
      XmlNode xmlnode; 

      FileStream fs = new FileStream(@"C:\text.xml", FileMode.Open, FileAccess.Read); 
      xmldoc.Load(fs); 

      xmlnode = xmldoc.ChildNodes[1]; 
      GetElements(xmlnode);      
     } 

     void GetElements(XmlNode inXmlNode) 
     { 
      XmlNode xNode; 
      XmlNodeList nodeList; 

      int i = 0; 

      if (inXmlNode.HasChildNodes) 
      { 
       nodeList = inXmlNode.ChildNodes; 

       for (i = 0; i <= nodeList.Count - 1; i++) 
       { 
        xNode = inXmlNode.ChildNodes[i]; 
        string ss = xNode.Name; 
        GetElements(xNode); 
       } 
      } 
      else 
      { 
       listBox1.Items.Add(inXmlNode.Name); 
      } 
     } 

回答

0

你可以縮短你的代碼,但你應該開始調用從第一個元素開始。

GetElements(xmldoc.ChildNodes[0]); 
void GetElements(XmlNode inXmlNode) 
    { 
     if(inXmlNode.HasChildNodes) 
     { 
      foreach (XmlNode childNode in inXmlNode.ChildNodes) 
      { 
       GetElements(childNode); 
      } 
     } 
     else 
     { 
      listBox1.Items.Add(inXmlNode.ParentNode.Name); 
     } 
    } 
+0

Batuu嗨,你的代碼對我的作品,但有一些調整。我使用'inXmlNode.ParentNode.Name'來代替。請改變你的答案,然後我會接受它。謝謝。 – yonan2236

+0

嗨yonan2236,編輯。另外,也許最好的做法是在你的方法中返回一個列表,以保持它只負責獲取名稱。在GetElements-Method之外填寫您的列表框。 – Batuu

0
  1. 你的問題不是很清楚,因爲你正在談論節點可以只包含一個值。由於無法知道給定節點在不知道底層架構的情況下能夠包含或不能包含的內容,因此我會假定您實際上是指做的只包含值的節點。
  2. 您(w.l.o.g.)<Language>元素中的文本值是文本節點。因此,對於這些節點,inXmlNode.HasChildNodes也評估爲true。您必須檢查是否有任何子節點的NodeType屬性設置爲XmlNodeType.Element,如果是,則跳過該元素。

請注意,所選的響應僅適用於特定情況。只要您的Xml文檔包含類似<Language><x/></Language>之類的東西,<Language>元素即使沒有文本內容也會出現在列表框中。如果Xml文檔包含<Language><x/><y/><z/></Language>,則<Language>甚至會出現在結果集中三次。