문제

이 질문은 이미 여기에 답이 있습니다.

나는 이전에 XML 파서를 사용해 왔으며, 그것이 잘 작동했지만 일반적으로 만족하지 않았기 때문에 기본 기능이어야 할 것들에 대한 해결 방법을 사용하는 것처럼 느껴졌습니다.

최근에 SimpleXML을 보았지만 아직 시도하지 않았습니다. 더 간단합니까? 둘 다 어떤 장점과 단점이 있습니까? 당신이 사용한 다른 구문 분석기?

도움이 되었습니까?

해결책

나는 말해야 할 것이다 단순 렉스 케이크는 처음으로 C로 작성된 확장이기 때문에 매우 빠르기 때문에 케이크를 가져갑니다. 그러나 둘째, 구문 분석 문서는 PHP 객체의 형태를 취합니다. 그래서 당신은 "쿼리"를 할 수 있습니다 $root->myElement.

다른 팁

PHP를 살펴보십시오 사용 가능한 XML 확장 그리고 봐라 http://devzone.zend.com/243/ 그리고 http://devzone.zend.com/1035/ 그것들에 대한 토론을 위해.

XML 파서와 SimpleXML의 주요 차이점은 후자가 풀 파서가 아니라는 것입니다. SimpleXML은 DOM 확장 위에 구축되었으며 전체 XML 파일을 메모리에로드합니다. XMLReader와 같은 XML 파서는 현재 노드를 메모리에만로드합니다. 파서가 발생할 때 트리거되는 특정 노드의 핸들러를 정의합니다. 그것은 더 빠르고 메모리를 절약합니다. XPath를 사용할 수 없으면 비용을 지불합니다.

개인적으로, 나는 Dom에서 제공하는 내용에서 Simplexml이 상당히 제한적이라고 생각합니다 (따라서 간단한). 그래도 DOM과 SimpleXML 사이를 쉽게 전환 할 수는 있지만 보통 Dom 경로를 직접 귀찮게하지 않습니다. DOM은 W3C DOM API의 구현이므로 다른 언어 (예 : JavaScript)에서 익숙 할 수 있습니다.

확장을 사용할 수없는 경우 빠르고 쉬운 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;
}
?>

안녕하세요 단순한 렉스 미가 매우 유용하다고 생각합니다. 그리고 나는 그것을 사용하고 있습니다 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 그래서 매우 빠릅니다.

XML 파일로 무엇을하려고하는지에 따라 다릅니다. XML 파일 (구성 파일과 같은)을 읽으려고하는 경우 Wicked Flea는 중첩 된 ArrayoBjects에 금액을 생성하므로 SimpleXML을 제안하는 데 맞습니다. 예를 들어 가치는 $ xml-> root-> child에 의해 액세스 할 수 있습니다.

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

CRXML 파서는 파서하기 쉽습니다.

이 클래스에는 검색 기능이 있으며,이 클래스는 네임 스페이스가있는 노드 이름을 인수로 가져옵니다. 노드의 XML을 검색하고 액세스 명령문을 인쇄 하여이 클래스를 사용하여 해당 노드에 액세스 할 수 있습니다. 이 클래스는 또한 XML 생성을 매우 쉽게 만듭니다.

이 클래스를 다운로드 할 수 있습니다

http://freshmeat.net/projects/crxml

또는 phpclasses.org에서

http://www.phpclasses.org/package/6769-php-manipulate-xml-documents-as-array.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top