XML 如何获取xml节点的穿透任意层次的“根节点”?高分求救!!!

sdl2005lyx 2008-02-15 09:43:30
在DOM路径查询中,我们可以用//符号来越过中间的节点,查询其子,孙或多层次下的其他所有元素
如:objNodeList = objDoc.SelectNodes(“Company//Employee”),就能得到穿透任意层次的所有Employee节点集合。

那么,反过来,如何获取一个节点任意层次的“根节点”,具体如下:
<Company>
<Department id="101">
<Department_Name>Cai WuBu</Department_Name>
<Manager>Zhang Bin</Manager>
<Employees>
<Employee id="12345">
<Employee_ID>12345</Employee_ID>
<Name>Zhang Bin</Name>
<Gender>male</Gender>
</Employee>
</Employees>
</Department>
</Company>

如果当前节点是Employee ,我怎么获取Department 节点,父节点一层一层往上回溯太过麻烦,请告知另外办法!
...全文
316 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
GDY__GDY 2010-01-03
  • 打赏
  • 举报
回复
跟着学习了,这几天我也在研究这里,我也想知道有没有什么快捷的方法,我怕自己写完了一看有现成的方法....
烈火蜓蜻 2009-05-06
  • 打赏
  • 举报
回复

XmlDocument aDoc = new XmlDocument();
aDoc.Load( @"D:\1.xml" ); //XML的文件
XmlNodeList xnodelist = aDoc.SelectNodes( "/maplist/map/mapname" );
IEnumerable<string> list = from xe in xnodelist.OfType<XmlNode>()
select xe.InnerText;

然后你可以用这个list去绑定
sdl2005lyx 2008-02-15
  • 打赏
  • 举报
回复
还有朋友回答吗,我要揭帖了!!!!
sdl2005lyx 2008-02-15
  • 打赏
  • 举报
回复
目前大部分XML解析器提供的办法,都是一层一层的往事回溯,没有直接到达的!不知道在XPath3.0是否提供这样的功能!?
  • 打赏
  • 举报
回复
貌似没有你想要得这种简单的逆查的方法。
XPathNavigator xpn = XNode.CreateNavigator();
xpn.SelectAncestors方法可以逆查,但是好像跟你的要求有差距。
sdl2005lyx 2008-02-15
  • 打赏
  • 举报
回复
我自己也查了一些关于XPath的资料,确实没有发现直接能穿透任意层次找到“父节点”的办法,看来目前只能用symbol441 的办法了!!感谢大家的回答,谢谢。。。
blestcc 2008-02-15
  • 打赏
  • 举报
回复
貌似没有什么好办法
做个标记等
mobin4211 2008-02-15
  • 打赏
  • 举报
回复
楼主给你一个我做的,要改一下

XmlDocument xmldoc = new XmlDocument();
string path = Server.MapPath("" + server + "/experts/files/");
DirectoryInfo dirinfo = new DirectoryInfo(path);
DirectoryInfo[] dirinfo2 = dirinfo.GetDirectories();
xmldoc.Load("" + path + "" + dirinfo2[m].ToString() + "\\ordersHistory.xml");
XmlNodeList nodelist = xmldoc.DocumentElement.ChildNodes;
ss += Convert.ToDouble(nodelist[0].SelectSingleNode("profit").InnerText.ToString());
ss2 += Convert.ToDouble(nodelist[0].SelectSingleNode("equity").InnerText.ToString());

symbol441 2008-02-15
  • 打赏
  • 举报
回复
总不能一直ParentNode下去吧
----------
据我所知,这个确没有什么捷径可寻.
//这种方式其式其实质就是一种递归遍历的搜索方式
就楼主这种情况,如果层次较少,可以直接采用取ParentNode的方式
如果层次太多,可以写一个递归算法函数去搜索其父节点,不过其过程原理其实都是差不多的,只是用起来相对简单一些.


Company//Employee这种方式,貌似现在还不能用,呵呵,以后也许可以吧^_^

wang520d 2008-02-15
  • 打赏
  • 举报
回复
好像没有什么捷径找吧。。。
用XPath 直接定位到某个节点 然后根据当前节点去找父节点
sdl2005lyx 2008-02-15
  • 打赏
  • 举报
回复
symbol441,感谢你的回复,你这个办法当然是可行的,我这个例子的层次是比较少的,如果层次很多,总不能一直ParentNode下去吧?能否湘“Company//Employee”这样直接找到想要的“父节点”?
symbol441 2008-02-15
  • 打赏
  • 举报
回复
你直接取Employee节点的父节点的父节点就不行了么?

objNodeList = objDoc.SelectNodes(“Company//Employee”)
foreach(XmlNode node in objNodeList)
{
XmlNodet ParentNode=node.ParentNode.ParentNode//这个不就是你要取的父节点Department节点了?

}
可能我还是没有理解.
sdl2005lyx 2008-02-15
  • 打赏
  • 举报
回复
其实我的意思很简单,我们通过“//”可以穿透任意多个层次访问到子节点,
那么是否有一种办法:反过来获取穿透任意多个层次的父节点??
sdl2005lyx 2008-02-15
  • 打赏
  • 举报
回复
我的意思:当前节点是Employee,怎么通过这个节点找到Department,并不是通过文档节点objDoc去找!!!
<Company>
<Department id="101">
<Department_Name>Cai WuBu</Department_Name>
<Manager>Zhang Bin</Manager>
<Employees>
<Employee id="12345">
<Employee_ID>12345</Employee_ID>
<Name>Zhang Bin</Name>
<Gender>male</Gender>
</Employee>
</Employees>
</Department>
</Company>
symbol441 2008-02-15
  • 打赏
  • 举报
回复
如何获取一个节点任意层次的“根节点”
不知道楼主所谓的根节点是什么节点?
吐司vivi 2008-02-15
  • 打赏
  • 举报
回复
通过 XPath 查询 XML
xiaojing7 2008-02-15
  • 打赏
  • 举报
回复
objNodeList = objDoc.SelectNodes(“Department”)
你的意思是什么啊 ?
sdl2005lyx 2008-02-15
  • 打赏
  • 举报
回复
怎么每人回复啊,请高手现身啊!!!

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧