SimpleXML:带有属性的父问题

时间:2014-10-08 23:51:19

标签: php xml xpath xml-parsing 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格式(注意&#34;类别名称&#34;添加):

<?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>

在解析之后的旧代码下面,因为添加了&#34;类别名称&#34;在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,子项并按属性排序但没有运气 - SimpleXML对我来说一直是个谜:)

2 个答案:

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

答案 1 :(得分: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
}