【问题标题】:LibXML doesn't find any nodes for my xpath expressionLibXML 没有为我的 xpath 表达式找到任何节点
【发布时间】:2010-09-30 12:41:53
【问题描述】:

我在 iPhone 应用程序中使用 xpath 和 LibXML 来查找 xml 文档中的一些节点。我是 xpath 的菜鸟,所以可能我做错了什么。 这是xml:


<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetUserByEmailResponse xmlns="http://tempuri.org/">
      <GetUserByEmailResult>
        <id>4006</id>
        <name>Kudor Gyozo</name>
        <email/>
        <image/>
        <facebookId>0</facebookId>
      </GetUserByEmailResult>
    </GetUserByEmailResponse>
  </soap:Body>
</soap:Envelope>

xpath 表达式是//GetUserByEmailResult。不返回任何节点。我希望得到&lt;GetUserByEmailResult&gt; 回来。如果我测试相同的东西 here 它可以正常工作。

UPDATE1:这是我从 .net Web 服务返回的内容。有没有办法忽略 libxml 中的命名空间?

【问题讨论】:

    标签: iphone objective-c xml xpath libxml2


    【解决方案1】:

    我不熟悉 iphone 库,但您可能必须在某处声明 namsepace / 前缀:如果您使用“someprefix”注册“http://tempuri.org/”,则可以搜索:

    //someprefix:GetUserByEmailResult
    

    一种可能的解决方法是(但不建议):

    //*[local-name()='GetUserByEmailResult']
    

    【讨论】:

      【解决方案2】:

      GetUserByEmailResult 元素位于 http://tempuri.org/ 命名空间中,因此您需要将该命名空间添加到 XPath 搜索中。

      您可以使用xmlXPathRegisterNs 函数来做到这一点:

      xmlXPathRegisterNs(context,  BAD_CAST "temp", BAD_CAST "http://tempuri.org/");
      

      那么您的 XPath 将不得不更改为

      //temp:GetUserByEmailResult
      

      【讨论】:

      • 是的,非常感谢。顺便说一句,有没有办法忽略命名空间?
      • @kudor gyozo:是的,您可以通过仅检查 XPath 表达式中的本地名称来忽略命名空间,如 Wrikken 的回答中所建议的那样。
      猜你喜欢
      • 1970-01-01
      • 2012-08-10
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2013-09-17
      • 1970-01-01
      相关资源
      最近更新 更多