Нужна помощь в обновлении кода 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 всегда был для меня загадкой 🙂
Вы перебирали все <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
}
Элементы категории существуют как их собственный массив при загрузке файла 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
}
}