SimpleXML: проблема с родителем с атрибутами

Нужна помощь в обновлении кода Simplexml, который я делал давно. Файл XML, с которого я разбираю, отформатирован по-новому, но я не могу понять, как с ним обращаться.

Пример старого формата XML:

<?xml version="1.0" encoding="UTF-8"?>
<pf version="1.0">
<pinfo>
<pid><![CDATA[test1 pid]]></pid>
<picture><![CDATA[http://test1.image]]></picture>
</pinfo>
<pinfo>
<pid><![CDATA[test2 pid]]></pid>
<picture><![CDATA[http://test2.image]]></picture>
</pinfo>
</pf>

а затем новый формат XML (добавлено примечание «название категории»):

<?xml version="1.0" encoding="UTF-8"?>
<pf version="1.2">
<category name="Cname1">
<pinfo>
<pid><![CDATA[test1 pid]]></pid>
<picture><![CDATA[http://test1.image]]></picture>
</pinfo>
</category>
<category name="Cname2">
<pinfo>
<pid><![CDATA[test2 pid]]></pid>
<picture><![CDATA[http://test2.image]]></picture>
</pinfo>
</category>
</pf>

И ниже старый код для разбора, который не работает с момента добавления «имени категории» в XML:

$pinfo = new SimpleXMLElement($_SERVER['DOCUMENT_ROOT'].'/xml/file.xml', null, true);
foreach($pinfo as $resource)
{
$Profile_id = $resource->pid;
$Image_url = $resource->picture;

// and then some echo´ing of the collected data inside the loop
}

Что мне нужно добавить или сделать совершенно иначе? Я пробовал с xpath, children и сортировку по атрибутам, но не повезло — SimpleXML всегда был для меня загадкой 🙂

0

Решение

Вы перебирали все <pinfo> элементы, расположенные в корневом элементе ранее:

foreach ($pinfo as $resource)

Теперь все <pinfo> элементы переместились из корневого элемента в <category> элементы. Теперь вам нужно сначала запросить эти элементы:

foreach ($pinfo->xpath('/*/category/pinfo') as $resource)

Теперь неправильно названная переменная $pinfo стоит немного на пути, так что лучше внести еще некоторые изменения:

$xml    = new SimpleXMLElement($_SERVER['DOCUMENT_ROOT'].'/xml/file.xml', null, true);
$pinfos = $xml->xpath('/*/category/pinfo');

foreach ($pinfos as $pinfo) {
$Profile_id = $pinfo->pid;
$Image_url  = $pinfo->picture;
// ... and then some echo´ing of the collected data inside the loop
}
0

Другие решения

Элементы категории существуют как их собственный массив при загрузке файла XML. XML, к которому вы привыкли разбираться, содержится внутри. Все, что вам нужно сделать, это обернуть ваш текущий код другим foreach, Кроме того, там не так много, чтобы измениться.

foreach($pinfo as $category)
{
foreach($category as $resource)
{
$Profile_id = $resource->pid;
$Image_url = $resource->picture;
// and then some echo´ing of the collected data inside the loop
}
}
0

По вопросам рекламы [email protected]