【问题标题】:( PHP ) How to xpath query the inner text of xs:documentation?( PHP ) 如何通过 xpath 查询 xs:documentation 的内部文本?
【发布时间】:2014-03-20 03:15:25
【问题描述】:

如何通过xpath查询xs:documentation的内部文本?

$xsd = simplexml_load_file('my_xsd_file.xsd');

// I have tried:
$xsd->xpath("./xs:complexType[1]/xs:annotation/xs:documentation");

$xsd->xpath("./xs:complexType[1]/xs:annotation/xs:documentation/text()");

$xsd->xpath("./xs:complexType[1]/xs:annotation/xs:documentation[text()]");

以上所有都返回一个空对象。

更新:

  • my_xsd_file.xsd 可以在gist.github.com/drupalista-br/9666339 找到
  • 打印出这个调用 $xsd->getDocNamespaces(); 返回:

    Array ( [ds] => http://www.w3.org/2000/09/xmldsig# [xs] => http://www.w3.org/2001/XMLSchema [] => http://www.portalfiscal.inf.br/nfe )

所以在我看来,命名空间已正确注册。

【问题讨论】:

    标签: php xpath xsd


    【解决方案1】:

    您还必须使用匹配的命名空间 URI 注册命名空间前缀 xs

    $xsd->registerXPathNamespace('xs', 'http://www.w3.org/2001/XMLSchema');
    

    此外,您省略了根元素<xs:schema/> 的第一个轴步骤。

    $xsd->xpath("/xs:schema/xs:complexType[1]/xs:annotation/xs:documentation");
    

    【讨论】:

    • my_xsd_file.xsd 可以在 gist.github.com/drupalista-br/9666339 找到。我已经打印出 $xsd->getDocNamespaces(); 的结果。这出现了:gist.github.com/drupalista-br/9666499 所以 xs 似乎已经注册了。你能看到我可能错过的东西吗?
    • 这个函数只返回XML中出现的所有命名空间;这并不意味着这些已经注册查询。他们甚至可以为同一个 URI 使用另一个前缀。
    • 我已经完成了注册和测试,就像你建议的那样,但我仍然得到一个空对象。为了确保返回的对象是正确的,我添加了一个测试属性 。属性成功返回。
    • 我刚刚开车去找我的一个客户并测试了我的原始代码。它工作得很好。我的直觉告诉我,这整件事与 PHP 版本有关。不记得我在办公室的机器上安装了哪个 PHP 版本,我认为它是 5.4.x,在我的客户端机器上是 5.3.10。要做更多的测试,让你现在稍后。非常感谢您。
    【解决方案2】:

    显然 PHP 5.4 xpath https://bugs.php.net/bug.php?id=62203 存在一个错误

    我在 PHP 5.3 上测试了我的代码,它运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2020-05-15
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      相关资源
      最近更新 更多