PHP için en iyi XML Ayrıştırıcı [çoğaltmak]

5 Cevap php

Bu soru burada zaten bir cevabı var:

5 Cevap

Ben SimpleXML öncelikle C ile yazılmış bir uzantısıdır, çünkü pasta alır ve çok hızlı olduğunu söylemek gerekir. Ancak ikinci, çözümlü belge PHP nesnenin şeklini alır. Yani $root->myElement gibi "sorgu" can.

http://php.net/manual/simplexml.examples.php

PHP'nin available XML extensions bir göz var ve bu bir tartışma için http://devzone.zend.com/article/1713 ve http://devzone.zend.com/article/2387 bkz.

XML Ayrıştırıcı ve SimpleXML arasındaki temel fark, ikinci bir çekme ayrıştırıcı değil olmasıdır. SimpleXML DOM uzantıları üstüne inşa edilmiş ve belleğe tüm XML dosyası yüklemek olacaktır. XMLReader gibi XML Ayrıştırıcı sadece belleğe geçerli düğümü yükleyecektir. Sen Ayrıştırıcı onu karşılaştığında tetiklenen alacak belirli düğümler için eylemciler tanımlayabilirsiniz. Yani hızlı ve belleğe kaydeder. XPath kullanmak mümkün değil varlık ile bunun için ödeme yaparsınız.

Şahsen, ben SimpleXML oldukça bu DOM üzerinden sunduğu ne (dolayısıyla basit) sınırlayıcı buluyorum. Gerçi kolayca DOM ve SimpleXML arasında geçiş yapabilirsiniz, ama genellikle rahatsız ve doğrudan DOM yol gitmeyin. DOM, W3C DOM API bir uygulama, yani örneğin JavaScript, diğer dillerden aşina olabilir.

Bu XML dosyaları ile yapmak için çalışıyoruz ne bağlıdır. Sadece (bir yapılandırma dosyası gibi) XML dosyasını okumak için çalışıyoruz eğer iç içe ArrayObjects tutarı ne oluşturur beri, Wicked Flea SimpleXML öne doğrudur. örneğin değeri $ xml-> root-> çocuk tarafından erişilebilir olacak.

Kullandığınız kapalı muhtemelen en iyi konum XML dosyalarını işlemek için arıyor DOM XML

Bir uzantısı mevcut değilken, bu hızlı ve kolay xml ayrıştırma için yararlı bir işlevdir:

<?php
/**
 * Convert XML to an Array
 *
 * @param string  $XML
 * @return array
 */
function XMLtoArray($XML)
{
    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $XML, $vals);
    xml_parser_free($xml_parser);
    // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
    $_tmp='';
    foreach ($vals as $xml_elem) {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_level!=1 && $x_type == 'close') {
            if (isset($multi_key[$x_tag][$x_level]))
                $multi_key[$x_tag][$x_level]=1;
            else
                $multi_key[$x_tag][$x_level]=0;
        }
        if ($x_level!=1 && $x_type == 'complete') {
            if ($_tmp==$x_tag)
                $multi_key[$x_tag][$x_level]=1;
            $_tmp=$x_tag;
        }
    }
    // jedziemy po tablicy
    foreach ($vals as $xml_elem) {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_type == 'open')
            $level[$x_level] = $x_tag;
        $start_level = 1;
        $php_stmt = '$xml_array';
        if ($x_type=='close' && $x_level!=1)
            $multi_key[$x_tag][$x_level]++;
        while ($start_level < $x_level) {
            $php_stmt .= '[$level['.$start_level.']]';
            if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
                $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
            $start_level++;
        }
        $add='';
        if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) {
            if (!isset($multi_key2[$x_tag][$x_level]))
                $multi_key2[$x_tag][$x_level]=0;
            else
                $multi_key2[$x_tag][$x_level]++;
            $add='['.$multi_key2[$x_tag][$x_level].']';
        }
        if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) {
            if ($x_type == 'open')
                $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
            else
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
            eval($php_stmt_main);
        }
        if (array_key_exists('attributes', $xml_elem)) {
            if (isset($xml_elem['value'])) {
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
                eval($php_stmt_main);
            }
            foreach ($xml_elem['attributes'] as $key=>$value) {
                $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
                eval($php_stmt_att);
            }
        }
    }
    return $xml_array;
}
?>

crxml ayrıştırıcı ayrıştırmak için gerçek bir kolaydır.

Bu sınıf, bir argüman olarak herhangi bir ad ile bir düğüm adını alır bir arama fonksiyonu, var. Bu sınıfı kullanarak bu düğümü erişmek için erişim açıklamada dışarı düğüm ve baskılar için xml arar. Bu sınıf ayrıca xml nesil çok kolay hale getirir.

Eğer bu sınıf indirebilirsiniz

http://freshmeat.net/projects/crxml

veya phpclasses.org gelen

http://www.phpclasses.org/package/6769-PHP-Manipulate-XML-documents-as-array.html