在xpath中遍历

时间:2018-08-17 13:01:04

标签: php xml xpath

我以前从未使用过xpath,它使我陷入困境。我有以下XML:

<entry>
 <updated>2018-02-20</updated>
  <api:related>
   <api:object>
    <api:ever-approved>true</api:ever-approved>
    <api:reporting-date-1>2017-12-31</api:reporting-date-1>
    <api:repository-items>
     <api:repository-item repository-id="1">
      <api:public-url>http://url.com</api:public-url>
      <api:content-file-count>1</api:content-file-count>
      <api:licence-file-count>1</api:licence-file-count>
      <api:status>accepted</api:status>
     </api:repository-item>
    </api:repository-items>
    <api:all-labels type="keyword-list">
     <api:keywords>
      <api:keyword>Africa</api:keyword>
      <api:keyword>Economy</api:keyword>
     </api:keywords>
    </api:all-labels>
  </api:object>
</api:related>

...在该结构中重复。我只需要编写一些PHP来检查每个条目是否存在“ api:repository-items”或其中的任何子节点。我可以成功完成以下任务:

  • api:未经批准
  • api:reporting-date-1
  • 第一个api:关键字

通过做以下事情的变体

foreach ( $this->xml->xpath( 'api:related/api:object/api:all-labels/api:keywords/api:keyword[1]' ) as $field ) {
        $this->properties['xxx'] = $field;
            }

 if ( isset( $this->properties['xxx'] ) ){
            return $this->properties['xxx'];
        } else {
            return 'nada';
        }

那很好。但是,我无法遍历存储库项目中的任何内容-我只会得到'nada'。

我尝试过:

  • 'api:related / api:object / api:repository-items / api:repository-item / api:status'
  • 'api:related / api:object / api:repository-items / api:repository-item / api:content-file-count'
  • 'api:related / api:object / api:repository-items / api:repository-item'
  • 'api:related / api:object / api:repository-items'
  • 'api:related / api:object // api:status'

我在做什么错-还有其他建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

如果我正确理解了XML,则这是正确的XPATH:

'//entry//api:repository-items'

//entry在XML中搜索到名为entry的节点的相对路径,而//api:repository-items在嵌套在api:repository-items上的节点//entry上搜索相对路径。在Col1 Col2 Col3 Col4 data1 data2 data3 abc data2 data3 data2 abcde data1 data2 data3 abcfef3f 上找到的节点。

强烈建议阅读w3schools XPATH guide。这是一本很好的指南,其中包含一些有关XPATH的信息,并带有一些图形示例,而且用时不长。