web-dev-qa-db-ja.com

PHPに最適なXMLパーサー

私は以前にXMLパーサーを使用しましたが、正常に機能していても、一般的には満足していませんでした。

最近SimpleXMLを見ましたが、まだ試していません。もっと簡単ですか?両方の長所と短所は何ですか?使用した他のパーサーはありますか?

143
Murat Ayfer

SimpleXML は、最初にCで書かれた拡張機能であり、非常に高速であるため、ケーキを取る必要があります。しかし、次に、解析されたドキュメントはPHPオブジェクトの形式を取ります。したがって、$root->myElementのように「クエリ」できます。

104
Robert K

PHPの 利用可能なXML拡張機能 を見て、 http://devzone.zend.com/243/http://devzone.zend.comを参照してください。/1035 / それらの議論。

XMLパーサーとSimpleXMLの主な違いは、後者がプルパーサーではないことです。 SimpleXMLはDOM拡張機能の上に構築され、XMLファイル全体をメモリにロードします。 XMLReaderのようなXMLパーサーは、現在のノードのみをメモリにロードします。パーサーが検出したときにトリガーされる特定のノードのハンドラーを定義します。それはより速く、メモリを節約します。 XPathを使用できないことで、その費用を支払います。

個人的には、SimpleXmlがDOMを介して提供するものを非常に制限している(したがって単純である)ことがわかりました。ただし、DOMとSimpleXmlを簡単に切り替えることはできますが、通常は気にしなくて直接DOMルートに移動します。 DOMはW3C DOM APIの実装であるため、JavaScriptなどの他の言語のDOMに精通しているかもしれません。

41
Gordon

これは、拡張機能が利用できない場合の迅速かつ簡単な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;
}
?>
28
NexusRex

こんにちは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構成を使用します。これにより、非常に高速に解析できます。 SimpleXmlCに記述されているため、非常に高速です。

16
Vahan

XMLファイルで何をしようとしているかによって異なります。 XMLファイル(設定ファイルなど)を読み取ろうとしている場合、Wicked Fleaは、ネストされたArrayObjectsに相当するものを作成するため、SimpleXMLを提案するのに適しています。例えば値は$ xml-> root-> childからアクセスできます。

XMLファイルを操作する場合は、おそらく DOM XML を使用するのが最善です。

11
dcousineau

crxmlパーサーは本当に簡単なパーサーです。

このクラスには検索関数があり、任意の名前空間をノード名として引数として使用します。ノードのxmlを検索し、このクラスを使用してそのノードにアクセスするためのアクセスステートメントを出力します。このクラスは、xmlの生成も非常に簡単にします。

このクラスは次の場所からダウンロードできます

http://freshmeat.net/projects/crxml

またはphpclasses.orgから

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

0
Sandeep.C.R