2013-11-27 22 views
0

首先我將序言說我只是在飛行中學習這一切,所以我可能不會使用正確的術語。使用PHP以遞歸方式查找xml子標籤,同時跟蹤父母

這裏是XML的一個非常簡化的版本,我需要解析:

<MyXML> 
    <Project> 
     <ProjectName>MyProject</ProjectName> 
     <ProjectType>Construction</ProjectType> 
    </Project> 
    <Folder> 
     <folderid>0</folderid> 
     <name>Root</name> 
     <Depth></Depth> 
     <Folder> 
      <folderid>43943</folderid> 
      <name>Construction Drawings</name> 
      <ParentEntityID>0</ParentEntityID> 
      <Folder> 
       <folderid>43944</folderid> 
       <name>Architectural</name> 
       <ParentEntityID>43943</ParentEntityID> 
       <Folder> 
        <folderid>43952</folderid> 
        <name>AutoCAD</name> 
        <ParentEntityID>43944</ParentEntityID> 
        <File> 
         <folderid>43952</folderid> 
         <filename>error.doc</filename> 
        </File> 
        <File> 
         <folderid>43952</folderid> 
         <filename>sb124a-map.jpg</filename> 
        </File> 
       </Folder> 
      </Folder> 
     </Folder> 
     <Folder> 
      <folderid>43975</folderid> 
      <name>Bid Management</name> 
      <ParentEntityID>0</ParentEntityID> 
      <File> 
       <folderid>43975</folderid> 
       <filename>ION Invoice 182 2013-04-09A.pdf</filename> 
      </File> 
      <Folder> 
       <folderid>99999</folderid> 
       <name>Temp</name> 
       <ParentEntityID>43975</ParentEntityID> 
       <File> 
        <folderid>99999</folderid> 
        <filename>ION Invoice 182 2013-04-09B.pdf</filename> 
       </File> 
      </Folder> 
     </Folder> 
    </Folder> 
</MyXML> 

正如你可以看到有文件夾的變化水平,與分散在各級文件。每個文件夾中還有一個對其父級文件夾(ParentEntityID)的引用,並且每個文件還具有對其父文件夾(folderid)的引用。不知道這是否有幫助。

我會從所有這一切需要的是每一個文件,並從該XML的列表其路徑,在CSV的項目名稱和項目類型,例如:

MyProject,Construction,Root/Construction Drawings/Architectural/AutoCad, error.doc 
MyProject,Construction,Root/Construction Drawings/Architectural/AutoCad, sb124a-map.jpg 
MyProject,Construction,Root/Bid Management,ION Invoice 182 2013-04-09A.pdf 
MyProject,Construction,Root/Bid Management/Temp,ION Invoice 182 2013-04-09B.pdf 

我可以計算出如何捕捉該結構的ProjectName和ProjectType始終是已知的並且是靜態的。我覺得我需要對文件夾/文件部分的可變性進行某種遞歸,但是我真的很掙扎。

在長達數千行的真正XML中,甚至File元素都有我需要捕獲數據的子元素,但是我想如果我能理解如何使用這個簡化的XML,那麼我應該能夠剩下的。我希望。謝謝。

回答

0

你說得對,遞歸是獲得這個結果的最好方法。

<?php 

function indepth($path, $current_folder) 
{ 
    global $project_name, $project_type; 
    $path[] = $current_folder->name;  
    foreach ($current_folder->File as $file) { 
     echo $project_name . ',' . $project_type . ',' . implode('/', $path) . ', ' . $file->filename . "\n"; 
    } 
    foreach ($current_folder->Folder as $folder) { 
     indepth($path, $folder); 
    } 
} 

$myxml = simplexml_load_file('test.xml'); 
$project_name = $myxml->Project->ProjectName; 
$project_type = $myxml->Project->ProjectType; 

foreach ($myxml->Folder as $folder) { 
    indepth(array(), $folder); 
} 

使用global通常不是一個很好的做法,但在這裏它允許訪問項目中深入變量(),而不將它們作爲論據,每次遞歸調用。

+0

請耐心等待。所以foreach($ myxml-> Folder as $文件夾)將解析頂層的每個文件夾?在$文件夾中包含XML中的當前「位置」?然後,深度函數查找當前級別的文件,然後查找當前級別的文件夾。當它找到一個它再次運行該功能時,查找文件,尋找更多的文件夾,向下鑽取。聽起來還不錯,如果在任何特定文件夾級別有更多元素需要檢查,我可以添加更多「$ current_folder-> elementname」來訪問「本地」元素。我在正確的軌道上嗎? – ChrisYYC

+0

你是。 $ folder和$ file變量是SimpleXMLElement對象。 [SimpleXML](http://us.php.net/manual/en/simplexml.examples-basic.php)可以非常方便地訪問XML文檔的每個元素。 – Erlock