通过包含名称空间前缀的xpath读取XML

时间:2015-06-07 12:59:15

标签: c# xml xpath xmldocument

我试图从中读取 http://api.hostip.info/?ip=12.215.42.19

XmlDocument xml = new XmlDocument();

xml.Load("http://api.hostip.info/?ip=79.177.176.8");

XmlNodeList xnList = xml.SelectNodes("gml:featureMember/Hostip");
foreach (XmlNode xn in xnList)
{
    string Name = xn["countryName"].InnerText;
    MessageBox.Show(Name);
}

我得到一个奇怪的错误

  

需要命名空间管理器或XsltContext。这个   query具有前缀,变量或用户定义的函数。

之前从未见过这样的事情......

1 个答案:

答案 0 :(得分:1)

首先,您必须先定义名称空间前缀到名称空间uri的映射,然后才能在xpath中使用前缀。在这种情况下,使用XmlNamespaceManager来定义映射,然后您可以简单地将命名空间管理器实例作为SelectNodes()的第二个参数传递:

......
var nsManager = new XmlNamespaceManager(new NameTable());
//register mapping of prefix to namespace uri 
nsManager.AddNamespace("gml", "http://www.opengis.net/gml");
//pass the namespace manager instance as 2nd param of SelectNodes():
XmlNodeList xnList = xml.SelectNodes("HostipLookupResultSet/gml:featureMember/Hostip", nsManager);
......

你的xpath还有另一个问题。 gml:featureMember不是XML的根元素,它是root的子元素。因此,您需要在gml:featureMember之前提及根元素,如上所示,或者使用descendant-or-self轴,如://gml:featureMember/Hostip(后者将有点虽然较慢)。