使用ZF2 Query从XML文档中获取值


Using ZF2 Query to get values from XML document

我试图获得<item>元素内的每个<img><caption>元素的值并存储在数组中。

我的XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<gallery>
    <item>
        <img>/data/images/galeries/mayens/middle/lemontgond.jpg</img>
        <caption><![CDATA[<font color="black" size="12"> Le Mont-Gond</font>]]></caption>
    </item>
    <item>
        <img>/data/images/galeries/mayens/middle/AlpagedeLodze1.jpg</img>
        <caption><![CDATA[<font color="black" size="12">Alpage de Lodze</font>]]></caption>
    </item>
</gallery>

我将XML文件的内容作为字符串并创建我的查询对象,然后尝试获取值,但它总是为空或不太正确,例如,我得到Le Mont-Gond]]>,这是不正确的,因为它没有正确地删除CDATA标签。

$content = file_get_contents(__THE_XML_FILE_ABOVE__);
$query = new Query($content);
foreach($query->queryXpath('item') as $item) {
    $subXml = $item->ownerDocument->saveXML($item);
    $subItem = new Query($subXml);
    $resultTitle = $subItem->queryXpath('//caption')->current()->nodeValue;
    $resultUrl   = $subItem->queryXpath('//img')->current()->nodeValue;
    var_dump($resultTitle, $resultUrl); die;
}

返回,不知道为什么它似乎为标题工作,而不是img ?

string ' Le Mont-Gond]]>' (length=16)
string '' (length=0)

试试这个-

$reader = new 'Zend'Config'Reader'Xml();
$data   = $reader->fromFile(__THE_XML_FILE_ABOVE__);
$items = $data['item'];
foreach($items as $item) {
    var_dump(strip_tags($item['caption']), $item['img']);
}

使用您提供的xml文件数据,结果是-

string ' Le Mont-Gond' (length=13)
string '/data/images/galeries/mayens/middle/lemontgond.jpg' (length=50)
string 'Alpage de Lodze' (length=15)
string '/data/images/galeries/mayens/middle/AlpagedeLodze1.jpg' (length=54)

我希望它有帮助。如果这不是期望的结果,请告诉我们。

使用

$query = new Query();
$query->setDocumentXML($content);
foreach($query->queryXpath('item') as $item) {
    $subXml = $item->ownerDocument->saveXML($item);
    $subItem = new Query();
    $subItem->setDocumentXML($subXml);
    $resultTitle = $subItem->queryXpath('caption')->current()->nodeValue;
    $resultUrl   = $subItem->queryXpath('img')->current()->nodeValue;
    var_dump($resultTitle, $resultUrl); die;
}