0

首先,感谢您花时间阅读本文:)

我需要帮助重新排序 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);
        } 

}
4

1 回答 1

0

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

这是我使用simplexmland的方法xpath,它也可以很容易地适应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

于 2013-05-27T22:11:20.430 回答