使用PHP和SimpleXML解析XML,其中项目名为<long>,<float>或<int> </int> </float> </long>

时间:2009-09-27 19:09:41

标签: php xml parsing simplexml primitive

我正在尝试解析Archive.org搜索功能中的数据。数据如下所示:

 <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/>";
    }
}

我尝试过使用 - &gt; children(), - &gt; doc和 - &gt; long或 - &gt; int。这些似乎都没有拿起long / int / float项。我开始认为这是因为它们是原始的,但我不知道如何解决这个问题。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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 s)

这表明“int”,“long”和等效项是循环中使用的$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时看起来没问题?
例如,下载次数似乎没问题?

答案 1 :(得分:0)

咳咳。因此,我正在阅读的XML似乎不是一个足够大的样本大小来包含我正在寻找的数据。如果我增加行数,则会显示数据并且我的代码正常。

所以,对我的代码工作而言,嘘我是个白痴,而且不能早点弄明白。

感谢您的帮助。