2010-12-10 34 views
1

我有一個XML文件,其中包含嵌套結構中的家族樹數據,並且我想將它解析爲嵌套列表。使用PHP解析XML到嵌套列表

我有以下代碼

<?php 
    $doc = new DOMDocument(); 
    $doc->load('armstrong.xml'); 
    echo $doc->saveXML(); 
?> 

它會加載下面的XML文件並打印出來的,是

<?xml version="1.0" encoding="UTF-8"?> 
<indi> 
    <id>id1</id> 
    <fn>Matt</fn> 
    <bday>1919</bday> 
    <dday>2000</dday> 
    <spouse>Evelyn Ross</spouse> 
    <family> 
     <indi> 
     <id>id2</id> 
     <fn>Jane</fn> 
     <bday></bday> 
     <dday></dday> 
     <spouse></spouse> 
     <family> 

     </family> 
    </indi> 
    <indi> 
     <id>id3</id> 
     <fn>Jason</fn> 
     <bday></bday> 
     <dday></dday> 
     <spouse></spouse> 
     <family> 

     </family> 
    </indi> 
    <indi> 
     <id>id4</id> 
     <fn>Samuel</fn> 
     <bday></bday> 
     <dday></dday> 
     <spouse></spouse> 
     <family> 
      <indi> 
       <id>id5</id> 
       <fn>John</fn> 
       <bday></bday> 
       <dday></dday> 
       <spouse></spouse> 
       <family> 

       </family> 
      </indi> 
      <indi> 
       <id>id6</id> 
       <fn>John</fn> 
       <bday></bday> 
       <dday></dday> 
       <spouse></spouse> 
       <family> 

       </family> 
      </indi> 
     </family> 
    </indi> 
</family> 

但是我想它解析爲以下格式:

<ul> 
    <li> 
    <span class="vcard person" id="id1"> 
      <span class="edit fn">Matt</span> 
     <span class="edit bday">1956</span> 
     <span class="edit dday"></span> 
      <span class="edit spouse">Eunace Fulton</span> 
     </span> 
    <ul> ... List of Family ... </ul> 
    </li> 
</ul> 

我很新的PHP,所以如果這是一個令人難以置信的簡單問題,我很抱歉!真的很感激任何想法。

編輯

我現在使用下面的遞歸循環,但仍然有問題

$doc = new DOMDocument(); 
    $doc->load('armstrong.xml'); 

    function outputIndi($indi) { 
     $i = new DOMDocument(); 
     $i = $indi; 

     echo '<li>'; 

     echo '<span class="edit fn">' . $indi->getElementsByTagName("fn") . '</span>'; // name not a real attribute, must access through DOM 
     echo '<span class="edit bday">' . $indi->getElementsByTagName("bday") . '</span>'; // ditto 
     // ... 

     echo '<ul>'; 
     foreach ($indi->getElementsByTagName("family") as $subIndi) { // again, family not a real attribute 
      outputIndi($subIndi); 
     } 
     echo '</ul>'; 

     echo '</li>'; 
    } 

    outputIndi($doc->documentRoot); 

    ?> 

回答

1

這裏是你的代碼。您需要添加其他屬性(dday,配偶)

RECURSION!

function outputIndi($indi) { 
    echo '<li>'; 
    $id = $indi->getElementsByTagName('id')->item(0)->nodeValue; 
    echo '<span class="vcard person" id="' . $id . '">'; 

    $fn = $indi->getElementsByTagName('fn')->item(0)->nodeValue; 
    $bday = $indi->getElementsByTagName('bday')->item(0)->nodeValue; 

    echo '<span class="edit fn">' . $fn . '</span>'; 
    echo '<span class="edit bday">' . $bday . '</span>'; 
    // ... 

    echo '<ul>'; 
    $family = $indi->getElementsByTagName('family')->item(0)->childNodes; 
    foreach ($family as $subIndi) { 
     outputIndi($subIndi); 
    } 
    echo '</ul>'; 
    echo '</span>'; 
    echo '</li>'; 
} 

$doc = new DOMDocument(); 
$doc->load('armstrong.xml'); 

outputIndi($doc->documentElement); 

你看,它輸出關於「INDI」的所有信息,通過<family>每個孩子循環,並調用本身上。那有意義嗎?

+0

是的,我想是的,謝謝!那麼,我傳遞給outputIndi()我現在擁有的$ doc變量的初始值是多少?當你說名字,bday等不是真正的屬性,這是否意味着你的代碼需要我做getElementsByTagName之類的東西? – 2010-12-10 23:44:51

+0

不太...'$ doc-> documentRoot'。是的,這是完全正確的,'getElementsByTagName'。 – Jonah 2010-12-10 23:50:49

+0

謝謝我試過了,我得到這個錯誤 致命錯誤:在/nfs/c05/h03/mnt/74985/domains/chris-armstrong.com/html/中的非對象上調用成員函數getElementsByTagName() gortin/index.php on line 115 – 2010-12-11 00:02:46