2017-06-12 72 views
0

我在Unity中用c#讀取XML文檔時遇到了很大的麻煩。 我試圖讀取XML具有這樣的結構:在C#中讀取一個複雜的XML文件(Unity3d)

<Classes A> 
<Class A></Class A> 
<Class A></Class A> 
    <Class A></Class A> 
    <Class A> 
    <Detail X> 
    <Detail Y> 
    </Class A> 
    <Class A> 
    (...) 

有時候,一個類有孩子;有時,A類是另一個A類的孩子等

我一直在嘗試和研究2天,但我無法理解如何閱讀此使用System.XML或System.XML.Linq

我能夠使用XDocument.Read()讀取所有的元素及其屬性,但是我無法獲得任何有關它們是由另一個類繼承的信息,還是有孩子本身。 我怎麼能讀一個元素,然後把它檢查是否有孩子,如果

一)有孩子,繼續讀孩子

二)有沒有孩子,繼續閱讀下一個元素。

據我所知,XNode可能包含我想要的信息。我也可以讀取所有的XNode。但我無法將任何XNode投射到XElement,反之亦然。沒有一個功能像我所期望的那樣行事。

+2

像這樣的嵌套的XML,你應該使用遞歸算法,讀它。不要太多時間了。通過遞歸,我喜歡創建一個類對象來包含每個節點。代碼非常簡單,只需不到10分鐘即可完成創建。 – jdweng

+0

我目前正在研究什麼是遞歸算法。不過,我認爲你的答案仍然不夠準確,我不明白。如果我擁有所有的節點(我知道如何獲得XNode),那麼我會如何處理它們?就我的研究而言,無法獲得XNode中包含的元素的名稱。沒有這個功能。 – lauch

+0

發佈一個有效的XML,我會幫助。確保沒有錯誤。使用VS檢查xml。從菜單:項目:添加新項目:XML。將xml粘貼到視圖中。就像任何編譯器錯誤一樣,錯誤將出現在錯誤列表中。 – jdweng

回答

1

示例XML

<?xml version="1.0" encoding="utf-8" ?> 
<Classes A="1"> 
    <Class A="1.1"/> 
    <Class A="1.2"> 
    <Detail X="1.2.1"/> 
    </Class> 
    <Class A="1.3"> 
    <Detail X="1.3.1"/> 
    <Detail Y="1.3.2"/> 
    </Class> 
    <Class A="1.4"/> 
</Classes> 

C#代碼

 public void XMLToTreeView() 
     { 
      var reader = XmlReader.Create(@"Path\Sample.xml"); 
      var xElement = XElement.Load(reader); 
      reader.Close(); 
      findAllNodes(xElement, treeView1); 
     } 

     private void findAllNodes(XElement xElement, TreeView treeView) 
     { 
      TreeNode ParentNode = treeView.Nodes.Add(xElement.Attributes().FirstOrDefault().Value); 
      foreach (XElement childElement in xElement.Elements()) 
      { 
       TreeNode node = new TreeNode(); 
       node.Text = childElement.Attributes().FirstOrDefault().Value; 
       ParentNode.Nodes.Add(node); 
       findAllNodes(childElement, node); 
      } 
     } 

     private void findAllNodes(XElement xElement, TreeNode node) 
     { 
      foreach (XElement childElement in xElement.Elements()) 
      { 
       TreeNode childNode = new TreeNode(); 
       childNode.Text = childElement.Attributes().FirstOrDefault().Value; 
       node.Nodes.Add(childNode); 
       findAllNodes(childElement, childNode); 
      } 
     } 

enter image description here