无法获取XML-child的内容

时间:2017-12-12 10:45:30

标签: php xml simplexml

我想了解这个内容:

    <wp:postmeta>
        <wp:meta_key>_wp_attached_file</wp:meta_key>
        <wp:meta_value><![CDATA[/home/image.jpg]]></wp:meta_value>
    </wp:postmeta>

这就是我试图解决这个问题的方法:

    $this->xml = simplexml_load_file($this->filepath);

    foreach($this->xml->channel->item as $item){

            $content = $item->children('http://purl.org/rss/1.0/modules/content/');
            $excerpt = $item->children('http://wordpress.org/export/1.2/excerpt/');
            $post = $item->children('http://wordpress.org/export/1.2/');

            foreach($post->postmeta as $meta){

                if($meta->meta_key == '_wp_attached_file'){
                    var_dump($meta->meta_value);
                }
                ($meta->meta_key == '_wp_attached_file') ? $path = $meta->meta_value : $path = null; 
            }
        }

但不幸的是我得到了这个结果:

object(SimpleXMLElement)#816 (1) {
  [0]=>
  object(SimpleXMLElement)#820 (0) {
  }
}

这个元素似乎是空的?如何获取值/home/image.jpg

1 个答案:

答案 0 :(得分:1)

在SimpleXMLElement上使用var_dump可能会给您部分结果。有几种方法可以获得一些有用的输出。有了一个非常简化的XML版本,这有希望给你一个想法......

if($meta->meta_key == '_wp_attached_file'){
    var_dump($meta->meta_value);
    echo (string)$meta->meta_value.PHP_EOL;
    echo $meta->meta_value->asXML();
}

这输出......

class SimpleXMLElement#9 (1) {
  public ${0} =>
  class SimpleXMLElement#11 (0) {
  }
}
/home/image.jpg
<wp:meta_value><![CDATA[/home/image.jpg]]></wp:meta_value>

如果您只是想通过使用XPath <meta_value> _wp_attached_file元素并仅提取此数据,则可以简化代码...

$xml->registerXPathNamespace("wp", "http://wordpress.org/export/1.2/");
foreach($xml->item as $item){
    $attachedFile= $item->xpath("//wp:postmeta[wp:meta_key[text() = '_wp_attached_file']]/wp:meta_value");
    var_dump($attachedFile);
    echo (string)$attachedFile[0].PHP_EOL;
    echo $attachedFile[0]->asXML();
}

XPath查找meta_key,即'_wp_attached_file',然后获取meta_value元素。由于您具有wp命名空间,因此必须先将其注册到xml,然后才能在任何XPath表达式中使用它。

最后= ->xpath()将返回匹配节点的列表,因此这应该是唯一的(在此做出假设)然后它在某些echo中使用[0]

这也输出......

array(1) {
  [0] =>
  class SimpleXMLElement#5 (0) {
  }
}
/home/image.jpg
<wp:meta_value><![CDATA[/home/image.jpg]]></wp:meta_value>