2013-01-15 27 views
0

我在做什麼錯誤的xpath沒有收拾東西?這個函數在另一個xml文件上工作正常,它的深度稍小。將XML轉換爲CSV Xpath不拾取任何東西

function xml2csv($xmlFile, $xPath) { 
    $xml = simplexml_load_file($xmlFile); 
    $path = $xml->xpath($xPath); 
    $csvData = ''; 
    foreach($path as $item) { 
     foreach($item as $key => $value) { 
      $csvData .= '"' . trim($value) . '"' . ','; 
     } 
     $csvData = trim($csvData, ','); 
     $csvData .= "\n"; 

    } 
    return $csvData; 
} 

XML使用

<?xml version='1.0'?> 
<bl> 
    <section> 
     <grade gradeLevel="1"> 
      <level dirname="The folder of pdfs"> 
       <file filename="hello_world.pdf">Hello world</file> 
       <file filename="the_avengers.pdf">The Avengers</file> 
       <file filename="batman.pdf">Batman</file> 
      </level> 
     </grade> 
    </section> 
</bl> 

當調用返回xml2csv('test.xml', 'bl');什麼,同樣與任何後bl/section/grade/*等等等等,也嘗試奇異打靶。 我期待至少有文件名輸出..

XML,似乎工作得很好我可以針對以下用同樣的方法上面的XML xml2csv('cars.xml', 'car');

<?xml version='1.0'?> 
<cars> 
    <car> 
     <color>blue</color> 
     <price>2000</price> 
    </car> 
    <car> 
     <color>red</color> 
     <price>10000</price> 
    </car> 
    <car> 
     <color>black</color> 
     <price>5000</price> 
    </car> 
</cars> 

汽車XML輸出

"blue","2000" 
"red","10000" 
"black","5000" 
+0

你嘗試過 「//文件」 爲您的XPath?應該選擇源文檔中任何位置的所有文件節點。 – javram

+0

您是不是通過刪除名稱空間聲明('xmlns')來簡化XML? – choroba

回答

0

不得不修改原始xml2csv功能,以涉及。使用section/grade定位。

更新功能仍在進行中的工作

function xml2csv($xmlFile, $xPath) { 
    $xml = simplexml_load_file($xmlFile); 
    $path = $xml->xpath($xPath); 
    $csvData = ''; 
    foreach($path as $item) { 
     $attributes = $item->attributes(); 
     $gradeLevel = $attributes['gradeLevel']; 
     foreach ($item->level as $level) { 
      foreach ($level->file as $file) { 
       $csvData .= '"' . trim($gradeLevel) . '"' . ','; 
       $csvData .= '"' . trim($level->attributes()->dirname) . '"' . ','; 
       $csvData .= '"' . trim($file->attributes()->filename) . '"' . ','; 
       $csvData .= '"' . trim($file) . '"' . ','; 
       $csvData .= "\n"; 

      } 

     } 
     $csvData = trim($csvData, ','); 
     $csvData .= "\n"; 
    } 
    return $csvData; 
}