PHP XML DOM -基于父属性/元素区分节点


PHP XML DOM - Distinguishing nodes based on parent attributes/elements

首先,感谢您花时间阅读这篇文章。

我需要帮助重新排序XML提要。我试了很多方法,也做了很多研究,但就是找不到解决办法。

<xml>
<group>
   <result>
      <title>Title</title>
      <url>URL</url>
      <text>Text</text>
   </result>
   <result>
      <title>Title</title>
      <url>URL</url>
      <text>Text</text>
   </result>
</group>
<group region=top>
   <result>
      <title>Title</title>
      <url>URL</url>
      <text>Text</text>
   </result>
</group>
<group type=bottom>
   <result>
      <title>Title</title>
      <url>URL</url>
      <text>Text</text>
      <moreinfo>
             <result>
             <title>Title</title>
             </result>
             <result>
             <title>Title</title>
             </result>
      </moreinfo>
   </result>
</group>
</xml>

我要做的是重新排序XML提要以显示'结果'中的每个节点。然而,我需要提要重新排序,所以"结果"从"组区域=顶部"是在顶部,然后从"组"的结果,然后从"组区域=底部"的结果。

您可能会注意到在'group region=bottom'中的'result'标签中嵌套了另一个'result'标签,这是导致大多数问题的原因。我设想的解决方案是使用以下伪代码:

$books = $doc->getElementsByTagName( "result" );
    foreach( $books as $book )
    {           
    if (parent_attribute = top){    
        $toptitle = $book->getElementsByTagName( "title" );
        $toptitle = $toptitle->item(0)->nodeValue;
            $topnew[]  =array("title"=>$toptitle);  
       }
            if (parent_attribute = null){
            $middletitle = $book->getElementsByTagName( "title" );
        $middletitle = $middletitle->item(0)->nodeValue;
            $middlenew[]  =array("title"=>$middletitle);            
        }
            if (parent_attribute = bottom){
            $bottomtitle = $book->getElementsByTagName( "title" );
        $bottomtitle = $bottomtitle->item(0)->nodeValue;
                if (parent_element = moreinfo){
                $moretitle = $book->getElementsByTagName( "title" );
                $moretitle = $moretitle->item(0)->nodeValue;
                }
            $bottomnew[]  =array("title"=>$bottomtitle, "more"=>$moretitle);
        } 
}

您发布的XML无效且不一致,因为属性值必须包含在""中,以保持一致性,请参阅我上面的评论。

这是我如何使用simplexmlxpath,它可以很容易地适应DOM

$xml = simplexml_load_string($x); // assuming XML in $x
$regions['top'] = $xml->xpath("group[@region='top']/result");
$regions['middle'] = $xml->xpath("group[not(@*)]/result"); // <group> with no attribute
$regions['bottom'] = $xml->xpath("group[@region='bottom']/result");
// output:
foreach ($regions as $region => $results) {
    echo "$region:<br />";
    foreach ($results as $result) {
    echo $result->title . "<br />";
    if (count($result->moreinfo) > 0)
        foreach ($result->moreinfo->result as $subresult) 
                    echo "____$subresult->title<br />";
    } // foreach $results
} // foreach $regions

查看它的工作情况:http://codepad.viper-7.com/5adWxC