C# 如何使用C检索作为XML数据树的有序子级#
假设我有以下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
<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
}
}
}