通过包含名称空间前缀的 xpath 读取 XML
Read XML by xpath containing namespace prefix
我正在尝试阅读这篇文章
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);
}
我收到一个奇怪的错误
Namespace Manager or XsltContext needed. This
query has a prefix, variable, or user-defined function.
以前从未见过这样的东西...
您需要先定义命名空间前缀到命名空间 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 的根元素,它是根元素的子元素。因此,您需要在 gml:featureMember
之前提及根元素,如上所示,或者使用 descendant-or-self
轴,如://gml:featureMember/Hostip
(后者将是 a bit虽然慢)。
我正在尝试阅读这篇文章 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);
}
我收到一个奇怪的错误
Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.
以前从未见过这样的东西...
您需要先定义命名空间前缀到命名空间 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 的根元素,它是根元素的子元素。因此,您需要在 gml:featureMember
之前提及根元素,如上所示,或者使用 descendant-or-self
轴,如://gml:featureMember/Hostip
(后者将是 a bit虽然慢)。