XML belgesi olarak PHP Nesne

8 Cevap php

Belirli bir PHP nesne almak ve XML olarak serialize için en iyi yolu nedir? Ben simple_xml bakıyorum ve ben nesnelere XML ayrıştırmak için kullanmış, ama bunun tersi nasıl çalıştığını bana açık değildir.

8 Cevap

PEAR'ın XML_Serializer paketine bir göz atın. Ben oldukça iyi sonuçlar ile kullandım. Bunu diziler besleyebilir, vb nesneleri ve XML içine dönecek. Ayrıca kök düğümü vb adını toplama gibi seçenekler bir grup var

Hile yapmak gerekir

Ben PEAR'ın XML_Serializer kullanarak kabul ediyorum, ancak iç içe özelliklere sahip nesneler / dizilerini destekler basit bir şey istiyorsanız, bunu kullanabilirsiniz.

class XMLSerializer {

    // functions adopted from http://www.sean-barton.co.uk/2009/03/turning-an-array-or-object-into-xml-using-php/

    public static function generateValidXmlFromObj(stdClass $obj, $node_block='nodes', $node_name='node') {
        $arr = get_object_vars($obj);
        return self::generateValidXmlFromArray($arr, $node_block, $node_name);
    }

    public static function generateValidXmlFromArray($array, $node_block='nodes', $node_name='node') {
        $xml = '<?xml version="1.0" encoding="UTF-8" ?>';

        $xml .= '<' . $node_block . '>';
        $xml .= self::generateXmlFromArray($array, $node_name);
        $xml .= '</' . $node_block . '>';

        return $xml;
    }

    private static function generateXmlFromArray($array, $node_name) {
        $xml = '';

        if (is_array($array) || is_object($array)) {
            foreach ($array as $key=>$value) {
                if (is_numeric($key)) {
                    $key = $node_name;
                }

                $xml .= '<' . $key . '>' . self::generateXmlFromArray($value, $node_name) . '</' . $key . '>';
            }
        } else {
            $xml = htmlspecialchars($array, ENT_QUOTES);
        }

        return $xml;
    }

}

Use a dom function to do it: http://www.php.net/manual/en/function.dom-import-simplexml.php

SimpleXML nesneyi içe ve sonra kaydetmek. Yukarıdaki bağlantıyı bir örnek içerir. :)

Özetle:

<?php
$array = array('hello' => 'world', 'good' => 'morning');

$xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><foo />");
foreach ($array as $k=>$v) {
  $xml->addChild($k, $v);
}
?>

oldukça özgün soruya bir cevap, ama bu benim sorunum çözüldü şekilde benim nesnesi olarak ilan oldu:

$root = '<?xml version="1.0" encoding="UTF-8"?><Activities/>';
$object = new simpleXMLElement($root); 

: zıt olarak

$object = new stdClass;

i herhangi bir değer ekleyerek başlamadan önce!

use WDDX: http://uk.php.net/manual/en/wddx.examples.php

(Bu uzantı yüklüyse)

o adanmıştır:

http://www.openwddx.org/

benim sürümü bir göz atın

class XMLSerializer {

/**
 * 
 * The most advanced method of serialization.
 * 
 * @param mixed $obj => can be an objectm, an array or string. may contain unlimited number of subobjects and subarrays
 * @param string $wrapper => main wrapper for the xml
 * @param array (key=>value) $replacements => an array with variable and object name replacements
 * @param boolean $add_header => whether to add header to the xml string
 * @param array (key=>value) $header_params => array with additional xml tag params
 * @param string $node_name => tag name in case of numeric array key
 */
public static function generateValidXmlFromMixiedObj($obj, $wrapper = null, $replacements=array(), $add_header = true, $header_params=array(), $node_name = 'node') 
{
    $xml = '';
    if($add_header)
        $xml .= self::generateHeader($header_params);
    if($wrapper!=null) $xml .= '<' . $wrapper . '>';
    if(is_object($obj))
    {
        $node_block = strtolower(get_class($obj));
        if(isset($replacements[$node_block])) $node_block = $replacements[$node_block];
        $xml .= '<' . $node_block . '>';
        $vars = get_object_vars($obj);
        if(!empty($vars))
        {
            foreach($vars as $var_id => $var)
            {
                if(isset($replacements[$var_id])) $var_id = $replacements[$var_id];
                $xml .= '<' . $var_id . '>';
                $xml .= self::generateValidXmlFromMixiedObj($var, null, $replacements,  false, null, $node_name);
                $xml .= '</' . $var_id . '>';
            }
        }
        $xml .= '</' . $node_block . '>';
    }
    else if(is_array($obj))
    {
        foreach($obj as $var_id => $var)
        {
            if(!is_object($var))
            {
                if (is_numeric($var_id)) 
                    $var_id = $node_name;
                if(isset($replacements[$var_id])) $var_id = $replacements[$var_id]; 
                $xml .= '<' . $var_id . '>';    
            }   
            $xml .= self::generateValidXmlFromMixiedObj($var, null, $replacements,  false, null, $node_name);
            if(!is_object($var))
                $xml .= '</' . $var_id . '>';
        }
    }
    else
    {
        $xml .= htmlspecialchars($obj, ENT_QUOTES);
    }

    if($wrapper!=null) $xml .= '</' . $wrapper . '>';

    return $xml;
}   

/**
 * 
 * xml header generator
 * @param array $params
 */
public static function generateHeader($params = array())
{
    $basic_params = array('version' => '1.0', 'encoding' => 'UTF-8');
    if(!empty($params))
        $basic_params = array_merge($basic_params,$params);

    $header = '<?xml';
    foreach($basic_params as $k=>$v)
    {
        $header .= ' '.$k.'='.$v;
    }
    $header .= ' ?>';
    return $header;
}    

}

Ben @ philfreo ve PEAR bağımlı olmamalı onun akıl kabul ederken, onun çözümü oldukça hala orada değildir. Anahtar aşağıdaki karakterlerden herhangi birini içeren bir dize olabilir zaman potansiyel sorunlar vardır:

  • <
  • >
  • \ S (boşluk)
  • "
  • '

XML grameri bu karakterleri kullanır gibi bu herhangi formatta atmak olacaktır. Yani, fazla uzatmadan, burada çok mümkün oluşumu için basit bir çözümdür:

function xml_encode( $var, $indent = false, $i = 0 ) {
    $version = "1.0";
    if ( !$i ) {
        $data = '

İşte bir örnek kullanım şöyledir:

// sample object
$tests = Array(
    "stringitem" => "stringvalue",
    "integeritem" => 1,
    "floatitem" => 1.00,
    "arrayitems" =>  Array("arrayvalue1", "arrayvalue2"),
    "hashitems" => Array( "hashkey1" => "hashkey1value", "hashkey2" => "hashkey2value" ),
    "literalnull" => null,
    "literalbool" => json_decode( json_encode( 1 ) )
);
// add an objectified version of itself as a child
$tests['objectitem'] = json_decode( json_encode( $tests ), false);

// convert and output
echo xml_encode( $tests );

/*
// output:

Anahtar adları Değişkenadı özniteliği (kodlanmış html) saklanır ve hatta tip saklanır dikkat edin, böylece simetrik de-serileştirme mümkündür. Bu sadece bir konu var: o sınıf yöntemleri dahil olmayacak sınıfları, sadece örneği nesneyi serialize olmaz. Bu ileri ve geri "veri" Geçen sadece işlevseldir.

Ben bu uzun zaman önce cevap olsa bile, bu, birisi yardımcı olur umarım.

Eh, biraz kirli ise, her zaman nesnenin özellikleri üzerinde bir döngü çalıştırabilir ...

$_xml = '';
foreach($obj as $key => $val){
  $_xml .= '<' . $key . '>' . $val . '</' . $key . ">\n";
}

Fopen / fwrite / fclose Eğer içerik olarak $_xml değişkeni ile bir XML dokümanı oluşturmak olabilir kullanma. Bu çirkin, ama çalışmaya devam eder.