如何使用C#检索有序的子级别作为XML数据树

时间:2014-02-26 23:25:10

标签: c# xml xpath xquery

假设我有以下xml结构

<Books>
  <Book >
      <property name="isbn" value="1"/>
      <property name="title" value="XML"/> 
         <Book >
                 <property name="isbn" value="11"/>
                 <property name="title" value="XML_C++"/> 
         </Book>
   </Book>

    <Book >
      <property name="isbn" value="2"/>
      <property name="title" value="C#"/>
   </Book>
</Books>

,输出应如下所示:

0- Books
 01- Book_isbn=1
   011-Book_isbn=11
 02-Book_isbn=2

因为我们可以看到结果类似于具有有序子级别的树 我需要一个代码来提供上面的字符串,其中包含xml节点作为树 每个父母首先拥有自己的孩子,然后是第二个父母及其子女等等.... 我的代码:

 XmlDocument xdoc = new XmlDocument();
            xdoc.Load(@"C:\myxml.xml");
            XmlNodeList dataNodes1 = xdoc.GetElementsByTagName("Books");
            // the parent here 
            Console.WriteLine("0" + dataNodes1[0].Attributes[0].Name  );

            // all children 
            foreach (XmlElement el in dataNodes1)
            {
                XmlNodeList nn = el.ChildNodes;
                int level=0;
                foreach (XmlElement eee in nn)
                {
                    if (eee.Name.ToLower() == "Book")
                    {                 
                        Console.WriteLine(level + " -"  + eee.Name + " "     + " - "    + eee.Attributes[0].Name  + " _" + eee.Attributes[0].Value); // attribute 0 means isbn
                    }
                    level++;
                }
            }

            // I got the result not ordered
             // I got something like this 
             /*
             0 Books
             1 Book_isbn=1
             2 Book_isbn=2
             3 Book_isbn=11
             */

所以有人可以给我一个提示,我怎样才能将这些元素显示为一个群体,每个群体都必须拥有自己的孩子......!

2 个答案:

答案 0 :(得分:0)

使用递归函数迭代xml树子项,并在每次调用时更新深层次。一个简单的算法可以让你开始:

ProcessChild(XmlElement root, int level)
{
   // do your printing here
   Console.WriteLine(level + root.Name);

   foreach(var child in root.ChildNodes)
   {
     ProcessChild(child, level + 1);
   }
}

开始处理所有节点:

ProcessChild(booksRoot, 0)

答案 1 :(得分:-1)

XmlDocument doc = new XmlDocument();            

            doc.Load("yourxmlfile");

            XmlNode root = doc.DocumentElement;
            var result = root.SelectNodes("Books");

            foreach (XmlElement item in result)
            {
//get title property from all nodes 
                foreach (XmlNode subitem in item.SelectSingleNode("title").ChildNodes)
                {
                    if (subitem.Name == "title") 
                    {                        
                      // do something
                    }                
                }               
            }