2012-03-28 95 views
0


問候如何創建一個嵌套的XML遞歸函數 - PHP

是否有人有遞歸函數的一些經驗?我試圖將一個XML文件解析成對象(在PHP中)(稍後在drupal中使用它) 我寫的代碼在第一個「children」節點幾乎總是相同之後(請參閱下面)。 只有2件事情的變化是從xpath的鏈接(什麼不應該那麼困難)和創建動態對象 - 變量(如果存在的話)。

第一個主題的代碼(整個事情是一個療程)

「$用品 - >的ident < - 衆所周知,因爲你是在foreach

$ resulty = $ xpaths-> xpath(「/ org.olat.course.Structure/rootNode/children/[ident = '$ item-> ident']/children/ [type ='st'or type ='sp'或輸入= 'bc']「);

foreach ($resulty as $itemy) { 

    $SubjectObject = new subject(); 

// isnt 100% correct but doesn't matter now 

    $SubjectObject->getSubjectFolders($FolderObject); 

    $SubjectObject->setSubjectId(isset($item->SubjectId) ? (string) $item->SubjectId: null); 
    $SubjectObject->setSubjectShortTitle(isset($item->SubjectName) ? (string) $item->SubjectName: null); 

    $ChapterObject->setSubject($SubjectObject); 
} 

現在 - 如果我想從從課件比這的對象時的主題將是

$ resulty = $ xpaths->的XPath(「/組織.olat.course.Structure/rootNode/children/[ident ='$ item-> ident']/children/ [type ='st'or type ='sp'or type ='bc']「);

foreach ($resulty as $itemy) { 

    $SubjectObject = new subject(); 

    $SubjectObject->getSubjectFolders($FolderObject); 

    $SubjectObject->setSubjectId(isset($itemy->SubjectId) ? (string) $itemy->SubjectId: null); 
    $SubjectObject->setSubjectShortTitle(isset($itemy->SubjectName) ? (string) $itemy->SubjectName: null); 

     $resultz = $xpaths->xpath("/org.olat.course.Structure/rootNode/children/*[ident = '$item->ident']children/*[ident = '$itemy->ident']/children/*[type = 'st' or type = 'sp' or type = 'bc']"); 

      foreach ($resultz as $itemz) { 

       $SubSubjectObject = new subject(); 

       $SubSubjectObject->getSubjectFolders($FolderObject); 

       $SubSubjectObject->setSubjectId(isset($itemz->SubjectId) ? (string) $itemz->SubjectId: null); 
       $SubSubjectObject->setSubjectShortTitle(isset($itemz->SubjectName) ? (string) $itemz->SubjectName: null); 



          $resulta = $xpaths->xpath("/org.olat.course.Structure/rootNode/children/*[ident = '$item->ident']/children/*[ident = '$itemy->ident']/children/*[ident = '$itemz->ident']/children/*[type = 'st' or type = 'sp' or type = 'bc']"); 

           foreach ($resulta as $itema) { 

            $SubSubSubSubjectObject= new subject(); 

            $SubSubSubSubjectObject->getSubjectFolders($FolderObject); 

            $SubSubSubSubjectObject->setSubjectId(isset($itema->SubjectId) ? (string) $itema->SubjectId: null); 
            $SubSubSubSubjectObject->setSubjectShortTitle(isset($itema->SubjectName) ? (string) $itema->SubjectName: null); 


                (and so on) 


            $SubSubSubjectObject->setSubject($SubSubSubSubjectObject); 
           } 



       $SubjectObject->setSubject($SubSubjectObject); 

      } 


    $ChapterObject->setSubject($SubjectObject); 

}

這裏是XML樹(例如)

<Structure> 

    <rootnode> 

     <CursusName>History</CursusName> 
     <CursusId>100001</CursusId> 
     <children> 

      <childNode> 

       <SubjectName>World War 1</SubjectName> 
       <SubjectId>100002</SubjectId> 
       <children> 

        <childNode> 

         <SubjectName>World War 1.1</SubjectName> 
         <SubjectId>100016</SubjectId> 
         <children> 

          <childNode> 

           <SubjectName>World War 1.1.1</SubjectName> 
           <SubjectId>100032</SubjectId> 
           <children> 

            <childNode> 

             <SubjectName>World War 1.1.1.1</SubjectName> 
             <SubjectId>100065</SubjectId> 
             </children> 

            </childNode> 

           </children> 
           +<children></children> 

          </childNode> 

         </children> 
         +<children></children> 

        </childNode> 
        +<childNode></childNode> 

       </children> 
       +<children></children> 

      </childNode> 
      +<childNode></childNode> 
      +<childNode></childNode> 

     </children> 
     +<visibility></visibility> 
     +<accessibility></accessibility> 

    </rootnode> 
    <version>1</version> 

</Structure> 

SO

有人可以幫助眉? 有人知道如何解決對象的問題嗎? 一種foreach/while循環創建對象?並將它們提取到他的父對象中?

遺憾的長期職位及代碼,所有的行

親切的問候

迪特

親切的問候

+0

我認爲你需要正確地格式化你的代碼... – ThiefMaster 2012-03-28 20:50:02

+0

對不起,我笑了。 – 2012-03-28 21:12:30

回答

0
function recurseResults($resulty) 
{ 
    foreach ($resulty as $itemy) 
    { 
     $SubjectObject = new subject(); 
     $SubjectObject->getSubjectFolders($FolderObject); 
     $SubjectObject->setSubjectId(isset($itemy->SubjectId) ? (string) $itemy->SubjectId: null); 
     $SubjectObject->setSubjectShortTitle(isset($itemy->SubjectName) ? (string) $itemy->SubjectName: null); 
     $resultz = $xpaths->xpath("/org.olat.course.Structure/rootNode/children/*[ident = '$item->ident']children/*[ident = '$itemy->ident']/children/*[type = 'st' or type = 'sp' or type = 'bc']"); 
     // __save my new subject somewhere__ 
     recurseResults($resultz); 
    } 
}