2009-09-27 4 views
0

Archive.org의 검색 기능에서 데이터를 구문 분석하려고합니다. 데이터는 다음과 같습니다.항목 이름이 PHP와 SimpleXML 인 XML 구문 분석 <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/>"; 
    } 
} 

-> 어린이() -> 문서 및 -> 길거나 -> INT. 이들 중 어느 것도 long/int/float 항목을 선택하지 않는 것 같습니다. 나는 그들이 프리미티브이기 때문에 그것이라고 생각하기 시작했다. 그러나 나는이 이슈를 고치는 방법을 모른다.

미리 도움을 주셔서 감사합니다.

+2

네임 스페이스가 관련되어 있습니까? 전체 xml을 게시 할 수 있습니까? –

+0

전체 XML에 링크가 추가되었습니다. –

답변

1

링크 된 search.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) 

(나는 나 좋은 var_dump의를 제공 Xdebug는을 사용하고 있습니다)

이것은 'int', 'long'및 이와 동등한 항목이 즉각적임을 나타냅니다. c 루프에 사용 된 $doc의 hildren; 이는이 같은 것을 사용할 수 있다는 것을 의미 :

$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();"줄을 제거하면, 선명한 출력을 얻기 위해, 나는 첫 번째 문서에 대한 얻을 : OK 보인다

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

내 부분에 근본적인 바보 (idiocy)가 있었기 때문에 문제를 해결하지 못했지만 기술적으로 정확한 답을 제공했습니다. 도움을 주셔서 감사합니다. 나는 당신을 정답으로 표시했습니다. –

+0

감사합니다. 재미있게 :-) –

0

Ahem. 그래서 내가 읽었던 XML이 내가 찾는 데이터를 포함 할만큼 충분히 큰 표본 크기가 아닌 것 같습니다. 행 수를 늘리면 데이터가 나타나고 코드는 정상입니다.

제 코드가 작동하기 때문에 제게 바보가되고 이전에 알아 내려고하지 못했습니다.

도움 주셔서 감사합니다.

+0

huhu, ok ^^ 불행한 일 ^^ –

관련 문제