PHP'nin SimpleXML ile XML Ayrıştırma

5 Cevap php

PHP'nin basit XML ile XML Ayrıştırma öğreniyorum. Benim kod:

<?php
$xmlSource = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>    <Document xmlns=\"http://www.apple.com/itms/\" artistId=\"329313804\" browsePath=\"/36/6407\" genreId=\"6507\">    <iTunes> myApp </iTunes> </Document>";

$xml = new SimpleXMLElement($xmlSource);

$results = $xml->xpath("/Document/iTunes");
foreach ($results as $result){
 echo $result.PHP_EOL;  
}

print_r($result);
?>

Bu çalıştığında bu hata ile, boş bir ekran döndürür. Ben Belge etiketiyle tüm özelliklerini kaldırırsanız, o döndürür:

myApp SimpleXMLElement Object ( [0] => myApp )

Hangi beklenen sonucudur.

Ben yanlış ne yapıyorum? Ben Apple'dan geliyor bu yana, XML kaynağı üzerinde kontrol yok unutmayın.

5 Cevap

Varsayılan ad ile ilgili kısmı için, okumak fireeyedboy's answer. Mentionned olarak, size varsayılan ad olan düğümler üzerinde XPath kullanmak istiyorsanız bir ad kaydetmek gerekir.

Eğer xpath() kullanmayın yoksa Ancak, SimpleXML automagically varsayılan ad seçer kendi sihirli vardır.

$xmlSource = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>    <Document xmlns=\"http://www.apple.com/itms/\" artistId=\"329313804\" browsePath=\"/36/6407\" genreId=\"6507\">    <iTunes> myApp </iTunes> </Document>";

$Document = new SimpleXMLElement($xmlSource);

foreach ($Document->iTunes as $iTunes)
{
    echo $iTunes, PHP_EOL;
}

Sizin xml varsayılan bir ad alanı içerir. Çalışmak için XPath sorgusu almak için bu ad kayıt ve sorguladığınız her xpath elemanı üzerinde ad öneki kullanmak gerekir (sürece bu unsurların gibi onlar sizin örnekte yapmak aynı ad altında tüm düşmek):

$xml = new SimpleXMLElement( $xmlSource );

// register the namespace with some prefix, in this case 'a'
$xml->registerXPathNamespace( 'a', 'http://www.apple.com/itms/' );

// then use this prefix 'a:' for every node you are querying
$results = $xml->xpath( '/a:Document/a:iTunes' );

foreach( $results as $result )
{
    echo $result . PHP_EOL; 
}

Bu genel örnektir

foreach ($library->children() as $child)
{
   echo $child->getName() . ":\n";
   foreach ($child->attributes() as $attr)
   {
    echo  $attr->getName() . ': ' . $attr . "\n";
  }
foreach ($child->children() as $subchild)
{
    echo   $subchild->getName() . ': ' . $subchild . "\n";
}
   echo "\n";
}

for more information check this : http://www.yasha.co/XML/how-to-parse-xml-with-php-simplexml-DOM-Xpath/article-1.html

Bu satır:

print_r($result);

foreach döngüsü dışında. Belki de denemelisiniz

print_r($results);

yerine.

XPath üzerine joker (/ /) kullanırsanız bu iş olacak gibi görünüyor. Belge elemanından namespace niteliğini (Ürün Kodu) kaldırırsanız Ayrıca, emin ama neden, mevcut kod çalışacaktır değil. Bir önek tanımlı değil belki çünkü? Neyse, aşağıdaki çalışması gerekir:

$results = $xml->xpath("//iTunes");
foreach ($results as $result){
 echo $result.PHP_EOL;  
}