2013-05-23 4 views
0

Прежде всего, спасибо за время прочтения этого :)PHP XML DOM - Различение узлов на основе родительского атрибутов/элементы

Мне нужна помощь переназначения фид 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 = top» находится вверху, затем результаты из «группы», затем результат «group region = bottom».

Возможно, вы заметили, что в теге 'result' в 'group region = bottom' есть другой тег '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); 
     } 

} 
+0

1. есть '<группа типа = "нижний">', 'не region' атрибут здесь - опечатка? 2. Что вы хотите совершить с этими «result/moreinfo/results»-node? пожалуйста, объясни! – michi

ответ

0

XML вы вывесили недействителен и не соответствует, так как значения атрибутов должны быть заключены в "", согласованность см мой комментарий выше.

Вот как я это делаю, используя simplexml и 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

+0

Извините за поздний ответ! Я запутался в своей проблеме с помощью XPath, но этот код намного лучше! Гораздо более кратким! Спасибо, @michi! –

Смежные вопросы