看了msdn中关于SelectSingleNode的例子。
XmlDocument doc = new XmlDocument();
doc.Load("booksort.xml");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("bk", "urn:samples");
XmlNode book;
XmlElement root = doc.DocumentElement;
book = root.SelectSingleNode("descendant::book[@bk:ISBN='1-861001-57-6']", nsmgr);
Console.WriteLine(book.OuterXml);
有几个地方,不明白!
1 XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
NameTable是一个什么样子的概念.它存储什么东东。
2 root.SelectSingleNode("descendant::book[@bk:ISBN='1-861001-57-6']", nsmgr);
SelectSingleNode方法为什么要使用"descendant::"和"nsmgr"这两个分别起什么作用。

解决方案 »

  1.   

    大概这个意思:NameTable 原子化字符串对象表:有些类(如 XmlDocument 和 XmlReader)在内部使用 XmlNameTable 类存储属性名和元素名。当 XML 文档中多次出现某个元素名或属性名时,该名称在 XmlNameTable 中只存储一次。这些名称存储为公共语言运行库 (CLR) 对象类型。这使您能够对这些字符串进行对象比较,而不是开销更大的字符串比较。这些字符串对象被称为 atomizedstrings。XmlNameTable 在 NameTable 类中实现。
    xml 带名称空间,因此需要 nsmgr来管理名称空间
    descendant::是限定节点的,与上面的2个概念没有关系
      

  2.   

    谢谢,孟子E章。
    但是,XmlNameTable还是不是很明白!能否用比较通俗的话解释一下。
    为什么在XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    时一定要doc.NameTable.