xml ayrıştırma: etiketleri sayısal dizi olmalıdır?

2 Cevap php
<?php
/*
    Sample: $results = XMLParser::load('<xml ....');
            $results = XMLParser::load(VSCHEMAS.'/Users.edit.xml');
*/

    /**
     * Abstract XMLParser class. A non-instantiable class that uses SimpleXML to parse XML, based on a path or body passed into the load method
     * 
     * @abstract
     */
    abstract class XMLParser {

        /**
         * convert function. Converts a SimpleXMLElement object to an associative array, usable for iteration
         * 
         * @see http://www.if-not-true-then-false.com/2009/12/php-tip-convert-stdclass-object-to-multidimensional-array-and-convert-multidimensional-array-to-stdclass-object/
         * @access private
         * @static
         * @param mixed $node node to convert to a non-object based value
         * @return array associative array of the passed in node/object, ultimately representing the initially passed in object as an associative array
         */
        private static function convert($node) {
            if(is_object($node))
                $node = get_object_vars($node);
            if(is_array($node))
                return array_map(array('self', 'convert'), $node);
            return $node;
        }

        /**
         * load function. Loads a source (either a local path or source body) document, and returns as associative array of it's results
         * 
         * @access public
         * @static
         * @param string $source xml body, or path to local xml file
         * @return array SimpleXML results, parsed as an associative array
         */
        public static function load($source) {
            $path = false;
            if(preg_match('/^\//', $source) > 0)
                $path = true;
            $simpleXMLElement = new SimpleXMLElement($source, LIBXML_NOENT, $path);
            return self::convert($simpleXMLElement);
        }
    }

?>

Xml dosyalarını ayrıştırmak ve bir daha çaprazlanabiliyorsa diziye dönüştürmek için yukarıdaki kodu kullanıyorum. Ama bir sorun haline çalıştırıyorum. Ben bazı örnek xml zaman olduğu gibi:

<fields>
    <rule whatever="lolcats" />
</fields>

vs

<fields>
    <rule whatever="lolcats" />
    <rule whatever="lolcats" />
</fields>

çıkan dizi tutarlı değildir. Yani, ilk durumda, bu biçiminin var:

Array
(
    [field] => Array
        (
            [@attributes]...

Ikincisi ise, bu biçimi var:

Array
(
    [field] => Array
        (
            [0]...

Ben burada ne söylüyorsam, ben istiyorum ne olduğu, sayısal alt xml elemanları endekslenmesi olduğuna göre, ama daha 1 olduğunda yalnızca olduğunu. Her zaman değiştirmek için ne herhangi bir düşünce onları yerine doğrudan daha, sayısal endeksli var tek-ve-sadece elemanın @ referans dizi bağlıyor?

Herhangi bir yardım çok takdir: D

2 Cevap

Peki, bir int yüzden sadece dizi tuşu 0 için test ve daha sonra beklediğiniz dizi çalışması gerektiğini dövme olan bir element veya bir attrib var olamaz.

boom! ben bir kaç saat için aşağıdaki kod biraz etrafında oynadı ve nihayet editörü dışarı çaldı! hüner değerin varlık referansları ile değişkenleri aracılığıyla döngü oldu, ve gerçekten bir nesne, ama anahtar (yukarıda belirtildiği gibi), '@ bağlıyor' değilse daha sonra bir dizide sarın: D

/**
 * convert function. Converts a SimpleXMLElement object to an associative array, usable for iteration
 * 
 * @see http://www.if-not-true-then-false.com/2009/12/php-tip-convert-stdclass-object-to-multidimensional-array-and-convert-multidimensional-array-to-stdclass-object/
 * @access private
 * @static
 * @param mixed $node node to convert to a non-object based value
 * @return array associative array of the passed in node/object, ultimately representing the initially passed in object as an associative array
 */
private static function convert($node) {
    if(is_object($node)) {
        $vars = get_object_vars($node);
        foreach($vars as $key => &$var) {
            if($key!=='@attributes' && is_object($var))
                $var = array($var);
        }
        $node = $vars;
    }
    if(is_array($node))
        return array_map(array('self', 'convert'), $node);
    return $node;
}