代码之家  ›  专栏  ›  技术社区  ›  Dean Putney

使用php和simplexml解析XML,其中的项命名为<long>、<float>或<int>

  •  0
  • Dean Putney  · 技术社区  · 15 年前

    我正试图解析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/>";
        }
    }
    

    我尝试过使用->children()、->doc和->long或->int。这些似乎都不能提取long/int/float项。我开始认为这是因为他们是原始人,但我不知道如何解决这个问题。

    事先谢谢你的帮助。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Pascal MARTIN    15 年前

    看看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 />';
    }
    

    到达“ 长的 '和' 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时,哪一个看起来正常?
    例如,下载计数似乎正常?

        2
  •  0
  •   Dean Putney    15 年前

    哎呀!因此,我从中读取的XML似乎没有足够大的样本大小来包含我要查找的数据。如果我增加行数,数据就会出现,代码也可以。

    所以,是的,因为我的代码在工作,因为我是个白痴,不能早点解决。

    谢谢你的帮助。