无法获取 XML-child 的内容
Can not get content of XML-child
我想获取这个内容:
<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
?
在 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 [=11=] =>
class SimpleXMLElement#11 (0) {
}
}
/home/image.jpg
<wp:meta_value><![CDATA[/home/image.jpg]]></wp:meta_value>
如果您只需要 _wp_attached_file
的 <meta_value>
元素,您可以通过使用 XPath 并仅提取此数据来简化代码...
$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
命名空间,因此在任何 XPath 表达式中使用它之前必须使用 xml 进行注册。
最后 = ->xpath()
将 return 一个匹配节点列表,所以这应该是唯一的(这里做一个假设)然后它在一些中使用 [0]
回声。
这也输出...
array(1) {
[0] =>
class SimpleXMLElement#5 (0) {
}
}
/home/image.jpg
<wp:meta_value><![CDATA[/home/image.jpg]]></wp:meta_value>
我想获取这个内容:
<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
?
在 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 [=11=] =>
class SimpleXMLElement#11 (0) {
}
}
/home/image.jpg
<wp:meta_value><![CDATA[/home/image.jpg]]></wp:meta_value>
如果您只需要 _wp_attached_file
的 <meta_value>
元素,您可以通过使用 XPath 并仅提取此数据来简化代码...
$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
命名空间,因此在任何 XPath 表达式中使用它之前必须使用 xml 进行注册。
最后 = ->xpath()
将 return 一个匹配节点列表,所以这应该是唯一的(这里做一个假设)然后它在一些中使用 [0]
回声。
这也输出...
array(1) {
[0] =>
class SimpleXMLElement#5 (0) {
}
}
/home/image.jpg
<wp:meta_value><![CDATA[/home/image.jpg]]></wp:meta_value>