PHPでxmlを読み込んで操作する方法まとめ

WBOY
リリース: 2016-06-20 13:04:20
オリジナル
1052 人が閲覧しました

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 が適切な選択です。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート