PHP ve öğeleri adlandırılır SimpleXML, ile XML Ayrıştırma

2 Cevap php

Ben Archive.org 'ın arama işlevselliği verilerini ayrıştırmak çalışıyorum. Veriler bu gibi görünüyor:

 <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>

İşte link to the full XML bulunuyor.

PHP'nin SimpleXML her doc alma cezası alır ve str etiketli öğeleri okuyabilir ve sadece iyi arr olabilir. Bu şamandıra, int ya da dışarı ucube uzun etiketli öğeleri, ve ben neden bilemiyorum.

Şöyle Benim ayrıştırma kodu:

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

> Doktor ve - - ()> çocuklar - Ben kullanarak denedim> uzun ya da -> int. Bunların hiçbiri uzun / int / float öğeleri almak gibi görünüyor. Ben onlar ilkel çünkü bu olduğunu düşünmeye başlıyorum, ama ben bu sorunu nasıl düzeltebilirim bilmiyorum.

Yardımlarınız için şimdiden teşekkür ederiz.

2 Cevap

XML verilere bir göz (search.xml size bağlı) alarak, ben bir sorun görünmemektedir.

Örneğin, ben bunu yaparsam:

$xml = simplexml_load_file('search.xml');
foreach ($xml->result->doc as $doc) {
    var_dump($doc);
}

Ben birkaç çıkışları, her biri bu gibi arayan var:

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)

(I'm using Xdebug, which gives me nice var_dump s)

Bu, 'int', long 'gösterir ve benzerleri $doc, bir döngüde kullanılan hemen çocuklar; hangi böyle bir şey kullanmak anlamına gelir:

$xml = simplexml_load_file('search.xml');
foreach ($xml->result->doc as $doc) {
    echo $doc->long . ' ; ' . $doc->float . '<br />';
}

'long' ve 'float' veri almak için; hangi ilk belgeler için, çıktıda bu tür verir:

4721 ; 0.0
;
2206 ; 0.0
1239 ; 3.5

Bu size yardımcı olur mu?


Actually, your code seems to work quite OK for me ; if I remove the "echo $item->getName();" line, to get a clearer output, I get, for the first document :

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

Which seems OK, when looking at the XML ?
For instance, the downloads count seems OK ?

Ahem. Bu yüzden ben okuyordu XML ben arıyorum verileri dahil etmek için yeterince büyük bir örneklem büyüklüğü değildi görünür. Ben satır sayısını artırmak, verileri görünür ve benim kod gayet iyi.

Yani, yay kodumu için çalışan, beni bir aptal olmak ve bunu daha önce anlamaya mümkün olmadığı için boo.

Yardımlarınız için teşekkürler.