2009-09-27 6 views
0

Я пытаюсь разобрать данные из функции поиска Archive.org. Данные выглядит следующим образом:Анализ XML с PHP и SimpleXML, где элементы называются <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/>"; 
    } 
} 

Я попытался с помощью -> дети() -> док и -> длинные или -> внутр. Ни один из них, похоже, не забирает элементы long/int/float. Я начинаю думать, что это потому, что они примитивы, но я не знаю, как исправить эту проблему.

Заранее за вашу помощь.

+2

Имеется ли пространство имен? Можете ли вы опубликовать полный xml? –

+0

Ссылка добавлена ​​в полный XML. –

ответ

1

Принимая во внимание данные XML (связанный с вами поиск.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

Вы предоставили технически правильный ответ, хотя это не решило проблему, потому что с моей стороны был основной идиотизм. Спасибо за вашу помощь, я отметил вас как правильный ответ. –

+0

Спасибо! Удачи :-) –

0

Ahem. Таким образом, кажется, что XML, который я читал, не был достаточно большим, чтобы включать данные, которые я ищу. Если я увеличиваю количество строк, появляются данные и мой код в порядке.

Итак, yay для моего кода работает, boo для меня, будучи идиотом и не в состоянии понять это раньше.

Благодарим за помощь.

+0

huhu, ok ^^ Не повезло ^^ –