xml_parse_into_struct

(PHP 4, PHP 5, PHP 7)

xml_parse_into_structXML veriyi çözümleyip sonucu bir dizi içinde döndürür

Açıklama

xml_parse_into_struct ( resource $çözümleyici , string $veri , array &$değerler [, array &$indis ] ) : int

Bu işlev bir XML belgeyi iki diziye çözümler. indis dizisi, değerler dizisindeki değerlerin konumlarına birer gösterici içerir. Bu dizilerin işleve gönderimli aktarılmaları gerekir.

Değiştirgeler

çözümleyici

xml_parser_create() ve xml_parser_create_ns() işlevleri tarafından döndürülen bir XML özkaynağı.

veri

değerler

indis

Dönen Değerler

Başarısızlık durumunda 0, başarı durumunda 1 döner. Bu, FALSE ve TRUE olarak ele alınmamalıdır. Dönen değeri === işleci ile karşılaştırın.

Örnekler

Aşağıdaki örnekte dönen dizilerin iç yapısı gösterilmiştir. Basit olarak, para etiketi içine note etiketini gömüp, bunu çözümledikten sonra üretilen dizileri dökümlüyoruz.

Örnek 1 - xml_parse_into_struct() örneği

<?php
$simple 
"<para><note>basit örnek</note></para>";
$p xml_parser_create();
xml_parse_into_struct($p$simple$vals$index);
xml_parser_free($p);
echo 
"İndis dizisi\n";
print_r($index);
echo 
"\nDeğerler dizisi\n";
print_r($vals);
?>

Çıktı şöyle olur:

İndis dizisi
Array
(
    [PARA] => Array
        (
            [0] => 0
            [1] => 2
        )

    [NOTE] => Array
        (
            [0] => 1
        )

)

Değerler dizisi
Array
(
    [0] => Array
        (
            [tag] => PARA
            [type] => open
            [level] => 1
        )

    [1] => Array
        (
            [tag] => NOTE
            [type] => complete
            [level] => 2
            [value] => basit örnek
        )

    [2] => Array
        (
            [tag] => PARA
            [type] => close
            [level] => 1
        )

)

Olaylarla tetiklenen çözümleme (expat kütüphanesine dayalı olarak) XML belgenin karmaşıklığına bağlı olarak karmaşıklaşabilir. Bu işlev DOM tarzı bir nesne üretmez fakat bir ağaç halinde uygun bir yapı üretir. Bu bakımdan, XML belge içindeki veriyi gösteren nesneler kolayca oluşturulabilir. Amino asitlerden oluşan küçük bir veritabanı olarak aşağıdaki XML belgeyi ele alalım:

Örnek 2 - moldb.xml - küçük bir moleküler bilgi veritabanı

<?xml version="1.0"?>
<moldb>

  <molecule>
      <name>Alanine</name>
      <symbol>ala</symbol>
      <code>A</code>
      <type>hydrophobic</type>
  </molecule>

  <molecule>
      <name>Lysine</name>
      <symbol>lys</symbol>
      <code>K</code>
      <type>charged</type>
  </molecule>

</moldb>
Bu belgeyi çözümleyip uygun nesneleri üretecek kod:

Örnek 3 - parsemoldb.php - moldb.xml dosyasını bir moleküler nesne dizisine çözümler

<?php

class AminoAcid {
    var 
$name;    // amino asidin ismi
    
var $symbol;  // üç harfli simge
    
var $code;    // tek harflik kod
    
var $type;    // hydrophobic, charged veya neutral

    
function AminoAcid ($aa)
    {
        foreach (
$aa as $k=>$v)
            
$this->$k $aa[$k];
    }
}

function 
readDatabase($filename)
{
    
// amino asit veritabanını okuyalım
    
$data implode(""file($filename));
    
$parser xml_parser_create();
    
xml_parser_set_option($parserXML_OPTION_CASE_FOLDING0);
    
xml_parser_set_option($parserXML_OPTION_SKIP_WHITE1);
    
xml_parse_into_struct($parser$data$values$tags);
    
xml_parser_free($parser);

    
// dizileri açalım
    
foreach ($tags as $key=>$val) {
        if (
$key == "molecule") {
            
$molranges $val;
            
// Dizi girdilerindeki her devamlı dizi çifti
            // bir molekülün alt ve üst aralıklarını tanımlar
            
for ($i=0$i count($molranges); $i+=2) {
                
$offset $molranges[$i] + 1;
                
$len $molranges[$i 1] - $offset;
                
$tdb[] = parseMol(array_slice($values$offset$len));
            }
        } else {
            continue;
        }
    }
    return 
$tdb;
}

function 
parseMol($mvalues)
{
    for (
$i=0$i count($mvalues); $i++) {
        
$mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
    }
    return new 
AminoAcid($mol);
}

$db readDatabase("moldb.xml");
echo 
"** Amino Asit Nesneleri Veritabanı:\n";
print_r($db);

?>
parsemoldb.php betiği çalıştırılınca, $db dizisi Amino asit nesnelerinden oluşturulmuş olur. Betiğin çıktısı şöyle olur:
** Amino Asit Nesneleri Veritabanı:
Array
(
    [0] => aminoacid Object
        (
            [name] => Alanine
            [symbol] => ala
            [code] => A
            [type] => hydrophobic
        )

    [1] => aminoacid Object
        (
            [name] => Lysine
            [symbol] => lys
            [code] => K
            [type] => charged
        )

)