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

时间:2014-07-01 08:18:23

标签: php xml zend-framework2

我正在尝试获取<img>元素中每个<caption><item>元素的值,并存储在数组中。

这是我的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文件的内容作为字符串获取并创建我的Query对象,然后尝试获取值,但它始终为null或不完全正确,例如我得到Le Mont-Gond]]>这是不正确的,因为它没有正确删除CDATA标记。<​​/ p>

$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)

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

使用它:

$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;
}