2009-09-27 48 views
0

我試圖解析來自Archive.org搜索功能的數據。數據是這樣的:使用PHP和SimpleXML解析XML,其中項目的名稱爲<long>,<float>或<int>

<doc> 
    <float name="avg_rating">5.0</float> 
    <arr name="collection"><str>U-Melt</str><str>etree</str></arr> 
    <arr name="format"><str>Checksums</str><str>Flac</str><str>Flac FingerPrint</str> 
    <str>Metadata</str><str>Ogg Vorbis</str><str>Text</str><str>VBR M3U</str> 
    <str>VBR MP3</str><str>VBR ZIP</str></arr> 
    <str name="identifier">umelt2009-09-19.main.km184.flac16</str> 
    <str name="mediatype">etree</str> 
    <int name="num_reviews">1</int> 
</doc> 

這裏有一個link to the full XML

PHP的SimpleXML可以很好地讀取每個文檔,並且可以讀取標記爲str和arr的項目。這是標記爲float,int或long的項目,它嚇壞了,我不明白爲什麼。

我的解析代碼如下:

/* OPENING FILE */ 

$xml = simplexml_load_file($pathname.$identifier_list); 

//Check the file to make sure it's got XML in it 
$xmlCheck = file_get_contents($pathname.$identifier_list); 
$xmlCheck = substr($xmlCheck,0,4); 

if (!$xmlCheck == "<?xm") { 
    die("<p>WARNING: ".$filename." doesn't looks like XML, quitting. Check it to see what's wrong."); 
} 
else { 

    $result = $xml->result; 
    echo "<br/><br/>".$result['name']."<br/>"; 

    $counter = 1; 

    foreach ($result->doc as $doc) { 

     echo "<br/><b>Document ".$counter."</b>"; 
     $counter++; 

     foreach ($doc->children() as $item) { 
      echo $item->getName(); 
      switch ((string) $item['name']) { 
       case 'identifier': 
        echo "<br/>Identifier: ".$item."\n"; 
        break; 
       case 'licenseurl': 
        echo "<br/>License URL: ".$item."\n"; 
        break; 
       case 'mediatype': 
        echo "<br/>Mediatype: ".$item."\n"; 
        break; 
       case 'downloads': 
        echo "<br/>Downloads: ".$item."\n"; 
        break; 
       case 'avg_rating': 
        echo "<br/>Average Rating: ".$item."\n"; 
        break; 
       case 'collection': 
        echo "<br/>Collection: ".$item."\n"; 
        break; 
      } 
     } 
     echo "<br/>"; 
    } 
} 

我已經嘗試使用 - >兒童() - > doc和 - >長或 - > int類型。這些似乎都沒有拿起long/int/float項目。我開始認爲這是因爲它們是原始的,但我不知道如何解決這個問題。

在此先感謝您的幫助。

+2

是否有涉及的命名空間?你能發佈完整的XML嗎? – 2009-09-27 19:15:11

+0

鏈接添加到完整的XML。 – 2009-09-27 19:25:18

回答

1

看看這個XML數據(你鏈接到的search.xml),我似乎沒有問題。

舉例來說,如果我這樣做:

$xml = simplexml_load_file('search.xml'); 
foreach ($xml->result->doc as $doc) { 
    var_dump($doc); 
} 

我有幾路輸出,每一個看起來像這樣:

object(SimpleXMLElement)[3] 
    public 'float' => string '0.0' (length=3) 
    public 'arr' => 
    array 
     0 => 
     object(SimpleXMLElement)[5] 
      public '@attributes' => 
      array 
       'name' => string 'collection' (length=10) 
      public 'str' => 
      array 
       0 => string 'sijis' (length=5) 
       1 => string 'netlabels' (length=9) 
       2 => string 'netlabels' (length=9) 
     1 => 
     object(SimpleXMLElement)[6] 
      public '@attributes' => 
      array 
       'name' => string 'format' (length=6) 
      public 'str' => 
      array 
       0 => string '256Kbps MP3' (length=11) 
       1 => string 'Text' (length=4) 
    public 'long' => string '4721' (length=4) 
    public 'str' => 
    array 
     0 => string 'sijis_SI8' (length=9) 
     1 => string 'http://creativecommons.org/licenses/by-nc-sa/2.0/' (length=49) 
     2 => string 'audio' (length=5) 
    public 'int' => string '0' (length=1) 

(我用Xdebug的,這給了我很好的var_dump小號)

這表明'int','long'及其等價物是直接的c在循環中使用的$doc的子節點;這意味着你可以使用這樣的事情:

$xml = simplexml_load_file('search.xml'); 
foreach ($xml->result->doc as $doc) { 
    echo $doc->long . ' ; ' . $doc->float . '<br />'; 
} 

要到「long」和「float」的數據;這給出了這種類型的輸出,對於第一批文件:

4721 ; 0.0 
; 
2206 ; 0.0 
1239 ; 3.5 

這是否對您有幫助?


其實,你的代碼對我來說似乎工作得很好;如果刪除「echo $item->getName();」路線,以獲得更清晰的輸出,我得到的,第一個文件:

Document 1 
Average Rating: 0.0 
Collection: 
Downloads: 4721 
Identifier: sijis_SI8 
License URL: http://creativecommons.org/licenses/by-nc-sa/2.0/ 
Mediatype: audio 

這似乎確定,在XML看時?
例如,下載計數似乎可以嗎?

+0

你提供了一個技術上正確的答案,儘管它並沒有解決問題,因爲我有潛在的白癡。感謝您的幫助,我已經標記爲正確答案。 – 2009-09-27 23:32:48

+0

謝謝!玩得開心:-) – 2009-09-28 04:07:08

0

Ahem。因此,看起來我讀的XML並不是一個足夠大的樣本量來包含我正在尋找的數據。如果我增加行數,數據出現,我的代碼很好。

所以,對於我的代碼工作,噓我是一個白癡,不能早點弄清楚。

感謝您的幫助。

+0

huhu,好的^^運氣不好^^ – 2009-09-27 19:41:51