2009-10-20 45 views
6

如何使用c#中的遞歸函數遍歷(按順序讀取所有節點)XML文檔?使用遞歸函數遍歷XML

我要的是讀取XML的所有節點(其中有屬性),並在相同的結構把它們打印成XML(但沒有節點的localName)

感謝

+1

我還是不明白你真正想做什麼。你可能會展示一個非常簡單而簡短的例子嗎?你的原始XML是什麼樣的,你想要回來什麼? 「打印它們」是什麼意思 - 寫入控制檯?寫入文件?你不應該看XSLT從XML轉換到XML嗎?看起來像一個完美契合。 –

+0

我同意XSLT是最好的1..但在這裏,我期待一個簡單的遞歸算法..無論如何 – Kaja

回答

3
IEnumerable<atype> yourfunction(XElement element) 
{ 
    foreach(var node in element.Nodes) 
    { 
     yield return yourfunction(node); 
    } 

//do some stuff 
} 
+0

我認爲我的問題沒有給予足夠的解釋。我想要的是,想要讀取所有節點在XML(其中有屬性)並以與xml相同的結構打印它(但不包含節點本地名稱) – Kaja

+0

返回阻止循環,呃循環。 – bmm6o

+0

@ bmm6o:看看「yield return」指令:http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx – Seb

22
using System.Xml; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var doc = new XmlDocument(); 
      // Load xml document. 
      TraverseNodes(doc.ChildNodes); 
     } 

     private static void TraverseNodes(XmlNodeList nodes) 
     { 
      foreach(XmlNode node in nodes) 
      { 
       // Do something with the node. 
       TraverseNodes(node.ChildNodes); 
      } 
     } 
    } 
} 
+0

thanx ..這解決了問題 – Kaja

+19

如果這解決了你的問題,你可以標記爲正確的答案?謝謝。 –

1

Here's a good example

static void Main(string[] args) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load("../../Employees.xml"); 
    XmlNode root = doc.SelectSingleNode("*"); 
    ReadXML(root); 
} 

private static void ReadXML(XmlNode root) 
{ 
    if (root is XmlElement) 
    { 
     DoWork(root); 

     if (root.HasChildNodes) 
      ReadXML(root.FirstChild); 
     if (root.NextSibling != null) 
      ReadXML(root.NextSibling); 
    } 
    else if (root is XmlText) 
    {} 
    else if (root is XmlComment) 
    {} 
} 

private static void DoWork(XmlNode node) 
{ 
    if (node.Attributes["Code"] != null) 
     if(node.Name == "project" && node.Attributes["Code"].Value == "Orlando") 
      Console.WriteLine(node.ParentNode.ParentNode.Attributes["Name"].Value); 
}