Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C检索作为XML数据树的有序子级#_C#_Xml_Xpath_Xquery - Fatal编程技术网

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

C# 如何使用C检索作为XML数据树的有序子级#,c#,xml,xpath,xquery,C#,Xml,Xpath,Xquery,假设我有以下xml结构 <Books> <Book > <property name="isbn" value="1"/> <property name="title" value="XML"/> <Book > <property name="isbn" value="11"/> <property n

假设我有以下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>
正如我们所看到的,结果类似于一棵树,它的子级是有序的 我需要一个代码来提供上面的字符串,其中包含作为树的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
             */

那么,有人能给我一个提示吗?我怎样才能将元素显示为一个组,因为每个组都有自己的子元素

使用递归函数迭代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)

看起来你应该寻找递归算法。那么你能帮我一下吗…?这不符合用户的要求,我只是举个例子。我用他的代码和我的代码创建了新的xml,它工作得很好。为什么你取消投票我的答案代码有很多逻辑,所以你不能取消任何用户的投票。你的代码不起作用。SelectNodes需要一个您没有提供的XPath匹配器。此外,您的代码没有到达ISBN 11的书中,因为您只迭代了一个深层次。顺便说一句,当你横穿树的时候,你不存储深层次,所以你不能打印@micha agus要求的数据。总之,您的代码没有满足用户的要求,因此您的解决方案是错误的。每个解决方案都有不同的逻辑。上面的代码可以很好地使用我的xml。
ProcessChild(booksRoot, 0)
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
                    }                
                }               
            }