Bu çok boyutlu bir dizi olarak xml verilere erişmek mümkün mü?

3 Cevap php

Ben kullanarak benim PHP yüklemek temel bir XML dosyası var

$xml = simplexml_load_file("file.xml");  

Ben benzer bir sözdizimi şey kullanarak benim veri erişim mümkün istiyorum:

$xml[0]['from'];
$xml['note']['from'];
$xml['from']['email'];

Ben bu kullanarak verilere erişebilir biliyorum:

foreach($xml->children() as $child) {
    echo $child->getName() . ": " . $child . "<br />";
}

Ancak, bu tercih edilen bir yöntem değil, ve ben çok boyutlu diziler için benzer bir sözdizimi kullanmak istiyorum.

Birçok farklı web sitelerinden API'lerini kullanarak, bu ben XML erişmek nasıl genellikle, ancak, ben simplexml_load_file("file.xml"); kullanarak kendi ile bunu yapmak için görünmüyor olabilir

Bu çok basit ama ben eksik bir şey var biliyor musun? Lütfen yardım edin! Şimdiden teşekkürler

XML Dosya:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>
    <name>Jani</name>
    <email>email@email.com</email>
</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

3 Cevap

ben sizin için onun değil mükemmel bir çözüm düşünüyorum ama sorun için size yardımcı olabilir.

XML DOSYA:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>
    <name>Jani</name>
    <email>email@email.com</email>
</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

PHP DOSYA:

<?php 
    $xml = simplexml_load_file("new.xml");  

    $webroot="http://".$_SERVER['HTTP_HOST']."/";
    $doc = new DOMDocument();

    $doc->load( $webroot.'/new.xml' );

    $note = $doc->getElementsByTagName( "note" );
    $final_arr = array();
    $i=0;
    foreach($note as $note)
    {
        $to = $note->getElementsByTagName( "to" );
        $to = $to->item(0)->nodeValue;
        $final_arr[$i]['to'] = $to;

        $from = $note->getElementsByTagName( "from" );
        foreach($from as $from)
        {
            $name = $from->getElementsByTagName( "name" );
            $name = $name->item(0)->nodeValue;
            $final_arr[$i]['from']['name'] = $name;
            $email = $from->getElementsByTagName( "email" );
            $email = $email->item(0)->nodeValue;
            $final_arr[$i]['from']['email'] = $email;
        }


        $heading = $note->getElementsByTagName( "heading" );
        $heading = $heading->item(0)->nodeValue;
        $final_arr[$i]['heading'] = $heading;

        $body = $note->getElementsByTagName( "body" );
        $body = $body->item(0)->nodeValue;
        $final_arr[$i]['body'] = $body;
        $i++;
    }

    echo "<pre>";
    print_r($final_arr);
    echo "</pre>";
?>

bu sizin için çalışır umuyoruz.

Eğer xml dosyasını kendiniz ayrıştırma sürece ne yazık ki, sen bunu yapamazsın. Düğümlerden birini erişmek için herhangi bir girişimi büyük olasılıkla bir dizeye dönüştürülür edilemez olduğunu söyleyerek bir DOM hata döndürecektir.

Bu yazı bir göz atabilirsiniz: http://bytes.com/topic/php/answers/1364-turn-xml-into-2-dimensional-array.

Eğer gerçekten yapmanız gereken şey ise, muhtemelen bunu işlemek için bir işlev veya sınıf oluşturma gibi ek bir adım ile kendiniz yapmanız gerekir.

"Ve ben çok boyutlu diziler için sözdizimi similar kullanmak istiyorum." - Yeterince benzer eğer ben bilmiyorum: $notes->note[0]->to; olarak

<?php
$notes = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1"?>
<notes>
  <note>
    <to>Tove</to>
    <from>
        <name>Jani</name>
        <email>email@email.com</email>
    </from>
    <heading>Reminder</heading>
    <body>Don\'t forget me this weekend!</body>
  </note>
  <note>...</note>
  <note>...</note>
</notes>');
echo $notes->note[0]->to;