【问题标题】:XmlDocument.SelectNodes questionXmlDocument.SelectNodes 问题
【发布时间】:2010-11-13 09:26:08
【问题描述】:

使用根节点选择和使用文档对象选择节点有什么区别? 首选哪种方式。

例如,

1.

XmlDocument Doc = new XmlDocument();
Doc.Load(mem);

XmlNodeList nodeList = Doc.SelectNodes(@"//@id");

2.

XmlDocument Doc = new XmlDocument();
Doc.Load(mem);

XmlElement root = Doc.DocumentElement;

XmlNodeList nodeList = root.SelectNodes(@"//@id");

【问题讨论】:

    标签: c# .net xml xmldocument selectnodes


    【解决方案1】:

    事实上,我从来没有任何不同。并且只使用

    Doc.SelectNodes(@"//@id");
    

    因为如果文档的根目录存在

    bool b = Doc.OuterXml == Doc.DocumentElement.OuterXml; // true
    

    【讨论】:

    • 虽然文档表明如果没有根元素,Doc.DocumentElement 将返回 null,因此 OP 上的第二个列表可能会抛出 NullReferenceException。不过,我同意你的看法。
    • @user496949:很高兴它有帮助! :)
    【解决方案2】:

    由于XPath// 表达式总是从文档根目录匹配,所以无论您从文档根目录还是从它的documentElement 开始,结果都是一样的。

    所以我猜你最好使用较短的Doc.SelectNodes("//@id"); 语法。

    【讨论】:

    • 只要文档的根存在Doc.OuterXml = Doc.DocumentElement.OuterXml 我认为任何查询都会返回相同的结果,XPath 或任何其他
    • @abatishchev,并非总是如此。例如,考虑文档<root><child /></root> 和XPath 表达式root。如果从文档元素中调用,它将不匹配任何内容。
    【解决方案3】:

    XML 文档的根至少包含它的文档元素,但它也可能包含处理指令和 cmets。例如,在这个 XML 文档中:

    <!-- This is a child of the root -->
    <document_element>
       <!-- This is a child of the document element -->
    <document_element>
    <!-- This is also a child of the root -->
    

    根有三个子节点,其中一个是它的顶级元素。在这种情况下,这个:

    XmlNodeList comments = doc.SelectNodes("comment()");
    

    还有这个:

    XmlNodeList comments = doc.DocumentElement.SelectNodes("comment()");
    

    返回完全不同的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多