以前にXMLパーサーを使用したことがあり、正常に機能していても、一般的には満足できませんでした。基本的な機能であるはずの問題に対して回避策を使用しているように感じました。
最近SimpleXMLを見ましたが、まだ試していません。もっと簡単ですか?どちらにもどのような長所と短所がありますか?使用した他のパーサーはありますか?
以前にXMLパーサーを使用したことがあり、正常に機能していても、一般的には満足できませんでした。基本的な機能であるはずの問題に対して回避策を使用しているように感じました。
最近SimpleXMLを見ましたが、まだ試していません。もっと簡単ですか?どちらにもどのような長所と短所がありますか?使用した他のパーサーはありますか?
SimpleXMLは、最初は拡張機能であり、Cで記述されており、非常に高速であるため、簡単に理解できます。しかし第二に、解析されたドキュメントはPHPオブジェクトの形式を取ります。したがって、のように「クエリ」を実行できます$root->myElement
。
PHP で利用可能な XML 拡張機能をご覧ください。
XML パーサーと SimpleXML の主な違いは、後者がプル パーサーではないことです。SimpleXML は DOM 拡張機能の上に構築され、XML ファイル全体をメモリに読み込みます。XMLReader のような XML パーサーは、現在のノードをメモリにロードするだけです。パーサーが検出したときにトリガーされる特定のノードのハンドラーを定義します。その方が高速で、メモリを節約できます。XPath を使用できないことで、その代償を払うことになります。
個人的には、SimpleXml が DOM を介して提供するものは非常に限られている (したがって単純である) と思います。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;
}
?>
こんにちは、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
いるので、とても速いです。
XML ファイルで何をしようとしているかによって異なります。XML ファイル (構成ファイルなど) を読み取ろうとしているだけの場合、ネストされた ArrayObjects に相当するものを作成するため、The Wicked Flea が 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