在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 节点,父节点一层一层往上回溯太过麻烦,请告知另外办法!

解决方案 »

  1.   

    objNodeList   =   objDoc.SelectNodes(“Department”)
    你的意思是什么啊 ?
      

  2.   

    通过 XPath 查询 XML
      

  3.   

    我的意思:当前节点是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>
      

  4.   

    你直接取Employee节点的父节点的父节点就不行了么?objNodeList   =   objDoc.SelectNodes(“Company//Employee”)
    foreach(XmlNode node in objNodeList)
    {
       XmlNodet ParentNode=node.ParentNode.ParentNode//这个不就是你要取的父节点Department节点了?}
    可能我还是没有理解.
      

  5.   

    symbol441,感谢你的回复,你这个办法当然是可行的,我这个例子的层次是比较少的,如果层次很多,总不能一直ParentNode下去吧?能否湘“Company//Employee”这样直接找到想要的“父节点”?
      

  6.   

    好像没有什么捷径找吧
    用XPath 直接定位到某个节点 然后根据当前节点去找父节点
      

  7.   

    总不能一直ParentNode下去吧
    ----------
    据我所知,这个确没有什么捷径可寻.
    //这种方式其式其实质就是一种递归遍历的搜索方式
    就楼主这种情况,如果层次较少,可以直接采用取ParentNode的方式
    如果层次太多,可以写一个递归算法函数去搜索其父节点,不过其过程原理其实都是差不多的,只是用起来相对简单一些.
    Company//Employee这种方式,貌似现在还不能用,呵呵,以后也许可以吧^_^
      

  8.   

    楼主给你一个我做的,要改一下                    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());
      

  9.   

    我自己也查了一些关于XPath的资料,确实没有发现直接能穿透任意层次找到“父节点”的办法,看来目前只能用symbol441 的办法了!!感谢大家的回答,谢谢
      

  10.   

    貌似没有你想要得这种简单的逆查的方法。
    XPathNavigator xpn = XNode.CreateNavigator();
    xpn.SelectAncestors方法可以逆查,但是好像跟你的要求有差距。
      

  11.   

    目前大部分XML解析器提供的办法,都是一层一层的往事回溯,没有直接到达的!不知道在XPath3.0是否提供这样的功能!?
      

  12.   


    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去绑定