PHP で XML を読み取って操作する方法のまとめ
XML (Extensible Markup Language) は、データを保存したり、データを交換したりするために使用できます。さまざまな種類のアプリケーション ソフトウェア プロンプト データなどに使用されます。
Web 開発の過程では、プログラムを使用して XML データを読み取り、関連する分析を実行するプログラムによく遭遇します。
以下では、PHP で XML を読み取り、操作するさまざまな方法をまとめます。
PHP が XML を読み取って解析するには、Xml パーサー、SimpleXML、XMLReader、DOMDocument という 4 つの一般的なメソッドがあります。これらの 4 つのメソッドそれぞれについて、いくつか説明します。
(1)Xml parseXML パーサーは Expat XML パーサーを使用します。 Expat は、XML ドキュメントを一連のイベントとして扱うイベントベースのパーサーです。イベントが発生すると、指定された関数を呼び出してそれを処理します。 Expat は、ドキュメントにリンクされている DTD を無視する検証不要のパーサーです。
ただし、ドキュメントの形式が適切でない場合は、エラー メッセージが表示されます。 Expat はイベントベースで検証がないため、高速であり、Web アプリケーションに適しています。 XML ドキュメント全体をメモリにロードして処理するのではなく、解析しながら処理するため、パフォーマンスが優れているという利点があります。しかし、まさにこのため、XML 構造を動的に調整したり、XML コンテキスト構造に基づいて複雑な操作を実行する必要があるユーザーには適していません。
適切に構造化された XML ドキュメントを解析して処理したいだけの場合は、タスクを適切に完了できます。 XML パーサーは、US-ASCII、ISO-8859-1、UTF-8 の 3 つのエンコード形式のみをサポートしていることに注意してください。XML データが他のエンコード形式である場合は、まず、上記の 3 つのいずれかに変換する必要があります。
一般に、XML パーサーのよく使用される解析メソッドは 2 つ (実際には 2 つの関数)、xml_parse_into_struct と xml_set_element_handler です。 XML Parser は PHP4 をサポートしているため、古いバージョンを使用しているシステムに適しています。したがって、ここでは詳しい説明はしません。
PHP5 環境の場合、以下の 3 つの方法を検討することをお勧めします。
(2) DOMDocumentDOMDocument は、PHP5 以降にリリースされた DOM 拡張機能の一部でもあり、html/xml の作成または解析に使用できます。現在、utf-8 エンコーディングのみをサポートしています。
以下は、PHP が DOMDocument を通じて xml を読み取る方法を示す例です。
$xmlstring=<<<XML<br /><?xml version='1.0'?><br /><document><br /> <cmd attr='default'>login</cmd><br /> <login>imdonkey</login><br /></document><br />XML;$dom=new DOMDocument();<br />$dom->loadXML($xmlstring);<br />print_r(getArray($dom->documentElement));<br />function getArray($node){<br /> $array=false;<br /> if($node->hasAttributes()){<br /> foreach ($node->attributes as $attr){<br /> $array[$attr->nodeName]=$attr->nodeValue;<br /> }<br /> }<br /> if($node->hasChildNodes()){<br /> if($node->childNodes->length==1){<br /> $array[$node->firstChild->nodeName]=getArray($node->firstChild);<br /> } else {<br /> foreach ($node->childNodes as $childNode){<br /> if($childNode->nodeType!=XML_TEXT_NODE){<br /> $array[$childNode->nodeName][]=getArray($childNode);<br /> }<br /> }<br /> }<br /> } else {<br /> return $node->nodeValue;<br /> }<br /> return $array;<br />}
DOMDocument は xml を一度にメモリにロードすることがプログラムからわかるため、メモリの問題に注意する必要があります。
(3) XMLReaderXMLReader も PHP5 以降の拡張機能です (PHP5.1 以降はデフォルトでインストールされます)。カーソルのようにドキュメント フロー内を移動したり、各ノードで停止したりするため、非常に柔軟な操作が可能です。
入力への高速かつ非キャッシュのストリーミング アクセスを提供し、ストリームまたはドキュメントを読み取り、ユーザーがそこからデータを抽出できるようにし、アプリケーションにとって意味のないレコードをスキップできます。
以下は、XMLReader の使用方法を示すために、PHP を使用して Google Weather API に関連する情報を取得する例です。詳細については、公式ドキュメントを参照してください。
$xml_uri='http://www.google.com/ig/api?weather=Beijing&hl=zh-cn';<br />$current=array();<br />$forecast=array();<br />$reader=new XMLReader();<br />$reader->open($xml_uri, 'gbk');<br />while ($reader->read()){<br /> //get current data<br /> if($reader->name=="current_conditions" && $reader->nodeType==XMLReader::ELEMENT){<br /> while($reader->read() && $reader->name!="current_conditions"){<br /> $name=$reader->name;<br /> $value=$reader->getAttribute('data');<br /> $current[$name]=$value;<br /> }<br /> }<br /> //get forecast data<br /> if($reader->name=="forecast_conditions" && $reader->nodeType==XMLReader::ELEMENT){<br /> $sub_forecast=array();<br /> while($reader->read() && $reader->name!="forecast_conditions"){<br /> $name=$reader->name;<br /> $value=$reader->getAttribute('data');<br /> $sub_forecast[$name]=$value;<br /> }<br /> $forecast[]=$sub_forecast;<br /> }<br />}<br />$reader->close();
XMLReader と XML Parser は似ており、どちらも読み取り中に動作します。大きな違いは、SAX モデルが「プッシュ」モデルであり、アナライザーがイベントをプッシュすることです。ノードに到達するとアプリケーションに通知され、XmlReader を使用するアプリケーションは、制御性が向上してリーダーから自由にノードを抽出できます。
XMLReader は libxml に基づいているため、一部の関数のドキュメントを参照して、使用している libxml バージョンに適用できるかどうかを確認する必要があります。
(4) SimpleXML SimpleXML も PHP5 以降に提供されたシンプルで使いやすい XML ツールのセットで、XML を処理に便利なオブジェクトに変換したり、XML データを整理して生成したりすることができます。ただし、名前空間 (ネームスペース) を含む XML には適用されず、XML は整形式である必要があります。
これは、simplexml_import_dom、simplexml_load_file、simplexml_load_string の 3 つのメソッドを提供します。これらの 3 つの関数名は、それぞれの機能を直感的に示しています。 3 つの関数はすべて SimpleXMLElement オブジェクトを返し、データは SimpleXMLElement 操作を通じて読み取り/追加されます。
例は次のとおりです。
$string = <<<XML<br /><?xml version='1.0'?><br /><document><br /> <cmd>login</cmd><br /> <login>imdonkey</login><br /></document><br />XML;$xml = simplexml_load_string($string);<br />print_r($xml);<br />$login = $xml->login;//这里返回的依然是个SimpleXMLElement对象<br />print_r($login);<br />$login = (string) $xml->login;//在做数据比较时,注意要先强制转换<br />print_r($login);
SimpleXML の利点は開発が簡単であることですが、欠点は XML 全体もロードすることです。処理前にメモリに保存されるため、解析中に内容が多すぎる XML ドキュメントを使用すると、圧倒される可能性があります。
小さなファイルを読み取っていて、XML に名前空間が含まれていない場合は、SimpleXML が適切な選択です。