복붙노트

PHP를위한 최상의 XML 파서 [duplicate]

PHP

PHP를위한 최상의 XML 파서 [duplicate]

나는 XML Parser를 이전에 사용해 왔지만, 정상적으로 작동 했음에도 불구하고 일반적으로 만족스럽지 않았습니다. 기본 기능이어야하는 것에 대한 대안을 사용하고있는 것 같았습니다.

최근에 SimpleXML을 보았지만 아직 시도하지는 않았습니다. 더 간단합니까? 두 가지 장점과 단점은 무엇입니까? 다른 파서는 사용하신 적이 있습니까?

해결법

  1. ==============================

    1.

    SimpleXML은 C로 작성된 첫 번째 확장이며 매우 빠르기 때문에 케이크를 가져 간다고해야합니다. 두 번째로, 파싱 된 문서는 PHP 객체의 형태를 취합니다. 그래서 당신은 $ root-> myElement와 같은 "질의"를 할 수 있습니다.

  2. ==============================

    2.

    PHP의 사용 가능한 XML 확장을 살펴보고 http://devzone.zend.com/243/ 및 http://devzone.zend.com/1035/에서 토론하십시오.

    XML Parser와 SimpleXML의 주된 차이점은 XML 파서와 SimpleXML의 차이점은 XML 파서와 SimpleXML이 끌어 오기 파서가 아니라는 것입니다. SimpleXML은 DOM 확장 기능 위에 구축되어 전체 XML 파일을 메모리에로드합니다. XMLReader와 같은 XML 구문 분석기는 현재 노드 만 메모리에로드합니다. Parser가 노드를 만날 때 트리거되는 특정 노드에 대한 핸들러를 정의합니다. 그것은 더 빠르며 메모리를 절약합니다. XPath를 사용할 수없는 상태로 비용을 지불합니다.

    개인적으로, 나는 SimpleXml이 DOM에 대해 제공하는 것에서 상당히 제한적이라는 것을 알 수있다. DOM과 SimpleXml 사이를 쉽게 전환 할 수는 있지만 일반적으로 DOM 경로를 직접 거치지는 않습니다. DOM은 W3C DOM API의 구현이므로 다른 언어 (예 : JavaScript)에서 익숙 할 수도 있습니다.

  3. ==============================

    3.

    이것은 확장 기능을 사용할 수 없을 때 빠르고 쉬운 xml 파싱을위한 유용한 함수입니다 :

    <?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;
    }
    ?>
    
  4. ==============================

    4.

    안녕하세요, 저는 SimpleXml이 매우 유용하다고 생각합니다. 그리고 그것으로 나는 xpath를 사용하고있다.

    $xml = simplexml_load_file("som_xml.xml");
    
    $blocks  = $xml->xpath('//block'); //gets all <block/> tags
    $blocks2 = $xml->xpath('//layout/block'); //gets all <block/> which parent are   <layout/>  tags
    

    나는 많은 xml 구성을 사용하고 있으며,이를 통해 나를 정말로 빠르게 파싱 할 수있다. SimpleXml은 C로 작성되어 매우 빠릅니다.

  5. ==============================

    5.

    그것은 당신이 XML 파일로 무엇을하려하는지에 달려 있습니다. 구성 파일과 같은 XML 파일을 읽으려는 경우, Wicked Flea는 중첩 ArrayObject에 해당하는 양을 생성하므로 SimpleXML을 제안하는 데 정확합니다. 예 : 값은 $ xml-> root-> child가 액세스 할 수 있습니다.

    XML 파일을 조작하려는 경우 DOM XML을 사용하는 것이 가장 좋을 것입니다.

  6. ==============================

    6.

    crxml 파서는 파서를 작성하기 쉽습니다.

    이 클래스에는 네임 스페이스가있는 노드 이름을 인수로 취하는 검색 함수가 있습니다. xml에서 노드를 검색하고 액세스 문을 인쇄하여이 클래스를 사용하여 해당 노드에 액세스합니다. 이 클래스는 또한 XML 생성을 매우 쉽게 만듭니다.

    이 수업은에서 다운로드 할 수 있습니다.

    http://freshmeat.net/projects/crxml

    또는 phpclasses.org에서

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

  7. from https://stackoverflow.com/questions/188414/best-xml-parser-for-php by cc-by-sa and MIT lisence