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_dumpsが得られます)

これは、' 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 に答える