【问题标题】:Read XML by xpath containing namespace prefix通过包含命名空间前缀的 xpath 读取 XML
【发布时间】:2015-06-07 12:59:15
【问题描述】:

我试图从中读取 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。这 查询有前缀、变量或用户定义的函数。

以前从未见过这样的东西......

【问题讨论】:

    标签: c# xml xpath xmldocument


    【解决方案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 的根元素,它是根的子元素。所以你需要在gml:featureMember 之前提到根元素,如上所示,或者使用descendant-or-self 轴,如://gml:featureMember/Hostip(虽然后者会有点慢)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多