0

我正在尝试从 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>

这是完整 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/>";
    }
}

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

在此先感谢您的帮助。

4

2 回答 2

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 时,这看起来不错?
例如,下载次数似乎还可以?

于 2009-09-27T19:36:06.797 回答
0

咳咳。因此,我从中读取的 XML 似乎没有足够大的样本量来包含我正在寻找的数据。如果我增加行数,数据就会出现并且我的代码很好。

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

谢谢你的帮助。

于 2009-09-27T19:39:42.233 回答