C#和XPath-如何查询

C#和XPath-如何查询,c#,xpath,C#,Xpath,我有一个XML文件,其结构如下: <mediawiki ...> <siteinfo>...</siteinfo> <page> <title>The Title</title> <id>42</id> ... </page> ... more page items ... </mediawiki> 现在,我想抓取一个具有给定id子元素

我有一个XML文件,其结构如下:

<mediawiki ...>
  <siteinfo>...</siteinfo>
  <page>
    <title>The Title</title>
    <id>42</id>
    ...
  </page>
  ... more page items ...
</mediawiki>
现在,我想抓取一个具有给定id子元素的页面元素。于是我写道:

XmlNode node = _xmlArticlesDocument.DocumentElement.SelectSingleNode
               ("//mediawiki/page[id=" + id.ToString() + "]");
但节点总是空的。我尝试了几个查询,包括“page/id”、“page”、“page”、“/page”、“//page”来获取任何内容,但node始终为null。我已经通过快速检查检查了_xmlArticlesDocument变量,它包含具有预期结构的正确XML文件

在我看来,我错过了一些非常基本的东西,但不知道是什么。也许这里有人有主意

提前感谢,, 弗兰克,你有没有试过:

_xmlArticlesDocument.DocumentElement.SelectSingleNode
               ("page[id='" + id.ToString() + "']"); // Note the single quotes

此外,如果任何XML节点位于非默认名称空间(即
)中,那么您还需要一个名称空间。

根据您目前向我们展示的内容,查询看起来是正确的。但是我怀疑mediawiki元素的“…”中有一个xmlns=“…”属性,对吗

我猜这就是让你绊倒的原因。您需要这样的代码:-

 XmlNamespaceManager nsmgr = new XmlNamespaceManager(_xmlArticlesDocument.NameTable);
 nsmgr.AddNamespace("a", "the-namespace-in-them-xmlns-attribute");
 XmlNode page = _xmlArticlesDocument.SelectSingleNode(String.Format("//a:page[id={0}]", id), nsmgr);

查看linqtoxml。我也是一个XML noob,我发现它更简单,XMLDocument。

应该将查询移到文档的开头。我不建议使用//。。。或者我不理解你的观点?别忘了确保/检查
id
不包含单引号,或者
SelectSingleNode()
将因XPath无效而失败。@Sean:很抱歉,这是一个非常简单的注释,原始查询无论如何都应该工作(我假设你错过了问题中的//部分).正如我现在测试的那样,单引号可以修改。正如您所提到的,问题是缺少名称空间。这是前进的方向,我在这方面遇到了很多麻烦,但一旦您掌握了这一点,就很容易了。:)一针见血!问题是缺少namespacemanager,这在教程I中没有提到。不过,需要对查询进行一点更改,因为id元素也在名称空间中:“A:page[A:id=“+id.toString()+”]”可以正确执行任务。非常感谢!我也正打算这么说。如果您还不知道XPath,只需要在C#.Net中通过XML解析它,那么Linq到XML就是一条出路。我同意,如果您还没有XPath,您可能会发现Linq方法更好,因为技能更容易转移。啊,我想这些都是开始出现问题的地方。在把这些片段组合在一起之后,我觉得它非常直观。有了StackOverflow这个令人敬畏的社区,那些启动问题不会长期得不到解决;)
 XmlNamespaceManager nsmgr = new XmlNamespaceManager(_xmlArticlesDocument.NameTable);
 nsmgr.AddNamespace("a", "the-namespace-in-them-xmlns-attribute");
 XmlNode page = _xmlArticlesDocument.SelectSingleNode(String.Format("//a:page[id={0}]", id), nsmgr);