在C#中用到xml文档中的内容,根节点(root)和根节点的下一级节点(rootChilds)可以直接得到,
而rootChilds中有<<很多子节点,子节点中又有子节点,且层数不定>>,要找的其中一个字节点(xxxNode),有关xxxNode的name,attributes都已知道,有什么好方法找到这个xxxNode节点?
尖括号中为关键。

解决方案 »

  1.   

    XmlNodeList nodes=doc.GetElementsByTagName("xxx");
    然后在这个nodes中循环查找他的attribute是不是符合规定,我一般用这种方式,不过应该有更好的方式,比如xpath,不过我对这方法了解很少,我遇到的问题一般也比较简单,所以就用这种糊弄的方法了.如果你是出于学习的目的,还是学学xpath吧,我现在是已经到了"只要能应付"就可以的状态了.
      

  2.   

    http://www.netvtm.com/w3s/xpath/index.asp
      

  3.   

    using System;
    using System.IO;
    using System.Xml;public class Sample
    {
      public static void Main()
      {      XmlDocument doc = new XmlDocument();
          doc.Load("booksort.xml");      //Create an XmlNamespaceManager for resolving namespaces.
          XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
          nsmgr.AddNamespace("bk", "urn:samples");      //Select and display the value of all the ISBN attributes.
          XmlNodeList nodeList;
          XmlElement root = doc.DocumentElement;
          nodeList = root.SelectNodes("/bookstore/book/@bk:ISBN", nsmgr);
          foreach (XmlNode isbn in nodeList){
            Console.WriteLine(isbn.Value);
          }   }}
    [C++] 
    #using <mscorlib.dll>
    #using <System.Xml.dll>
    using namespace System;
    using namespace System::IO;
    using namespace System::Xml;
    using namespace System::Collections;int main() 
    {
       XmlDocument* doc = new XmlDocument();
       doc -> Load(S"booksort.xml");   // Create an XmlNamespaceManager for resolving namespaces.
       XmlNamespaceManager* nsmgr = new XmlNamespaceManager(doc -> NameTable);
       nsmgr -> AddNamespace(S"bk", S"urn:samples");   // Select and display the value of all the ISBN attributes.
       XmlNodeList * nodeList;
       XmlElement * root = doc -> DocumentElement;
       nodeList = root -> SelectNodes(S"/bookstore/book/@bk:ISBN", nsmgr);
       IEnumerator* myEnum = nodeList->GetEnumerator();
       while (myEnum->MoveNext())
       {
          XmlNode* isbn = __try_cast<XmlNode*>(myEnum->Current);
          Console::WriteLine(isbn -> Value);
       }
    }
    该示例使用文件 booksort.xml 作为输入。
    <?xml version="1.0"?>
    <!-- A fragment of a book store inventory database -->
    <bookstore xmlns:bk="urn:samples">
      <book genre="novel" publicationdate="1997" bk:ISBN="1-861001-57-8">
        <title>Pride And Prejudice</title>
        <author>
          <first-name>Jane</first-name>
          <last-name>Austen</last-name>
        </author>
        <price>24.95</price>
      </book>
      <book genre="novel" publicationdate="1992" bk:ISBN="1-861002-30-1">
        <title>The Handmaid's Tale</title>
        <author>
          <first-name>Margaret</first-name>
          <last-name>Atwood</last-name>
        </author>
        <price>29.95</price>
      </book>
      <book genre="novel" publicationdate="1991" bk:ISBN="1-861001-57-6">
        <title>Emma</title>
        <author>
          <first-name>Jane</first-name>
          <last-name>Austen</last-name>
        </author>
        <price>19.95</price>
      </book>
      <book genre="novel" publicationdate="1982" bk:ISBN="1-861001-45-3">
        <title>Sense and Sensibility</title>
        <author>
          <first-name>Jane</first-name>
          <last-name>Austen</last-name>
        </author>
        <price>19.95</price>
      </book>
    </bookstore>
      

  4.   

    楼主:我这里有一篇平常整理的文章,相信你看了,问题可以解决,我截取查询部分发给你: 2 XML 数据的查询 
      最常见的XML数据类型有:Element, Attribute,Comment, Text. 
      Element, 指形如<Name>Tom<Name>的节点。它可以包括:Element, Text, Comment, ProcessingInstruction, CDATA, and EntityReference. 
      Attribute, 指在<Employee id=”12345”>中的粗体部分。 
      Comment,指形如:<!-- my comment --> 的节点。 
      Text,指在<Name>Tom<Name>的粗体部分。 
      在XML中,可以用XmlNode对象来参照各种XML数据类型。 
      2.1 查询已知绝对路径的节点(集) 
      objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee”) 
      或者 
      objNodeList = objNode.SelectNodes(“/Company/Department/Employees/Employee”) 
      以上两种方法可返回一个NodeList对象,如果要返回单个节点可使用SelectSingleNode方法,该方法如果查询到一个或多个节点,返回第一个节点;如果没有查询的任何节点返回 Nothing。例如: 
      objNode = objNode.SelectSingleNode(“/Company/Department/Employees/Employee”) 
      If Not (objNode is Nothing) then 
       ‘- Do process 
      End If 
      2.2 查询已知相对路径的节点(集) 
      可使用类似于文件路径的相对路径的方式来查询XML的数据 
      objNode = objDoc.SelectSingleNode(“Company/Department”) 
      objNodeList = objNode.SelectNodes(“../Department) 
      objNode = objNode.SelectNode(“Employees/Employee”) 
      2.3 查询已知元素名的节点(集) 
      在使用不规则的层次文档时,由于不知道中间层次的元素名,可使用//符号来越过中间的节点,查询其子,孙或多层次下的其他所有元素。例如: 
      objNodeList = objDoc.SelectNodes(“Company//Employee”) 
      2.4 查询属性(attribute)节点 
      以上的各种方法都返回元素(element)节点(集),返回属性(attribute),只需要采用相应的方法,在属性名前加一个@符号即可,例如:
    objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee/@id”) 
      objNodeList = objDoc.SelectNodes(“Company//@id”) 
      2.5 查询Text节点 
      使用text()来获取Text节点。 
      objNode= bjDoc.SelectSingleNode(“Company/Department/Deparmt_Name/text()”) 
      2.6 查询特定条件的节点 
      使用[]符号来查询特定条件的节点。例如: 
      a. 返回id号为 10102的Employee节点 
       objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee[@id=’10102’]”) 
      b. 返回Name为Zhang Qi的Name 节点 
       objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee/Name[text()=’Zhang Qi’]”) 
      c. 返回部门含有职员22345的部门名称节点 
      objNode = objDoc.SelectSingleNode("Company/Department[Employees/Employee/@id='22345']/Department_Name") 
      2.7 查询多重模式的节点 
      使用 | 符号可以获得多重模式的节点。例如: 
      objNodeList = objDoc.SelectNodes(“Company/Department/Department_Name | Company/Department/Manager”) 
      2.8 查询任意子节点 
      使用*符号可以返回当前节点的所有子节点。 
      objNodeList = objDoc.SelectNodes(“Company/*/Manager) 
      或者 
      objNodeList = objNode.ChildNodes 
      

  5.   

    参考数据 :
      <?xml version="1.0" encoding="UTF-8"?> 
      <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> 
        <Employee id="10101"> 
        <Employee_ID>10101</Employee_ID> 
        <Name>Zhang QI</Name> 
        <Gender>female</Gender> 
        </Employee> 
        <Employee id="10102"> 
        <Employee_ID>10102</Employee_ID> 
         <Name>Zhang Xia</Name> 
        <Gender>male</Gender> 
        </Employee> 
        <Employee id="10201"> 
        <Employee_ID>10201</Employee_ID> 
        <Name>ZhangChuang</Name> 
        <Gender>male</Gender> 
        </Employee> 
        <Employee id="10202"> 
        <Employee_ID>10202</Employee_ID> 
        <Name>Zhang Jun</Name> 
        <Gender>male</Gender> 
        </Employee> 
        </Employees> 
        </Department> 
        <Department id="102"> 
        <Department_Name>KaiFa Bu</Department_Name> 
        <Manager>Wang Bin</Manager> 
        <Employees> 
        <Employee id="22345"> 
        <Employee_ID>22345</Employee_ID> 
        <Name>Wang Bin</Name> 
        <Gender>male</Gender> 
        </Employee> 
        <Employee id="20101"> 
        <Employee_ID>20101</Employee_ID> 
        <Name>Wang QI</Name> 
        <Gender>female</Gender> 
        </Employee> 
        <Employee id="20102"> 
        <Employee_ID>20102</Employee_ID> 
        <Name>Wang Xia</Name> 
        <Gender>male</Gender> 
        </Employee> 
        <Employee id="20201"> 
        <Employee_ID>20201</Employee_ID> 
        <Name>Wang Chuang</Name> 
        <Gender>male</Gender> 
        </Employee> 
        <Employee id="20202"> 
        <Employee_ID>20201</Employee_ID> 
        <Name>Wang Jun</Name> 
        <Gender>male</Gender> 
        </Employee> 
        </Employees> 
        </Department> 
      </Company>
      

  6.   

    解决层数不定的问题还是比较容易的,因为知道要查找的该节点的属性和名字了
    假设的XML文件为:Doc.xml
    XmlDocument xdoc = new XmlDocument();
    xdoc.Load(@"路径\Doc.xml");
    //得到你Load进来的XML文件,将该文件设为_docxml
    //......
    // 查找节点
    XmlNode xnode = _docxml.SelectSingleNode("descendant::xxxNode[@属性="属性的Value"]");
    //属性包括:"id","type"等等对该节点的描述
      

  7.   

    to: sdl2005lyx() 
       我这里有一篇平常整理的文章,相信你看了,问题可以解决,我截取查询部分发给你:可把这篇文章给我吗?
    =============================================================================谢谢各位。