ホームページ  >  記事  >  バックエンド開発  >  PHP拡張のXML操作(1)-SimpleXML

PHP拡張のXML操作(1)-SimpleXML

黄舟
黄舟オリジナル
2018-05-17 09:38:185136ブラウズ


1. 概要とインストール

SimpleXML 拡張機能は、XML を一般的な属性セレクターと配列イテレーターを備えたオブジェクトに変換できる、非常にシンプルで使いやすいツールセットを提供します。

この拡張機能には libxml PHP 拡張機能が必要です。これは、--enable-libxml を使用する必要があることを意味しますが、libxml はデフォルトで有効になっているため、これは暗黙的に行われます。

PHP5 以降が必要です。

この拡張機能はデフォルトで有効になっており、コンパイル時に次のオプションを使用して無効にできます: --disable-simplexml

2. 使用例

基本的な使用方法

例 #1 XML 文字列を含むファイル example.php をインクルードします。

<?php
$xmlstr = <<<XML
<?xml version=&#39;1.0&#39; standalone=&#39;yes&#39;?>
<movies>
<movie>
<title>PHP: Behind the Parser</title>
<characters>
<character>
<name>Ms. Coder</name>
<actor>Onlivia Actora</actor>
</character>
<character>
<name>Mr. Coder</name>
<actor>El Act&#211;r</actor>
</character>
</characters>
<plot>
So, this language. It&#39;s like, a programming language. Or is it a
scripting language? All is revealed in this thrilling horror spoof
of a documentary.
</plot>
<great-lines>
<line>PHP solves all my web problems</line>
</great-lines>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie>
</movies>
XML;
?>

SimpleXML の単純さは、基本的な XML ドキュメントから文字列または数値を抽出するときに最もよくわかります。

例 #2 a82a54010e8e844b28dec6f52c796df1

<?phpinclude &#39;example.php&#39;;
$movies = new SimpleXMLElement($xmlstr);
echo $movies->movie[0]->plot;?>

を取得する上記のルーチンは出力します:

   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.

PHP の命名規則で許可されていない文字 (ハイフンなど) を含む XML ドキュメント内の要素にアクセスするには、要素名を中かっことアポストロフィでカプセル化します。

例 #3 15a73cc5312745b1b00671f6e690e36a

<?phpinclude &#39;example.php&#39;;
$movies = new SimpleXMLElement($xmlstr);
echo $movies->movie->{&#39;great-lines&#39;}->line;?>
の取得

上記の例 ルーチンは次の出力を行います:

PHP solves all my web problems

例 #4 SimpleXML 内の非固有要素へのアクセス

要素の複数のインスタンスが 1 つの親要素の子として存在する場合、通常の反復手法が適用されます。上記のルーチンは出力します:

<?phpinclude &#39;example.php&#39;;
$movies = new SimpleXMLElement($xmlstr);
/* For each <character> node, we echo a separate <name>. */foreach ($movies->movie->characters->character as $character) {
echo $character->name, &#39; played by &#39;, $character->actor, PHP_EOL;}
?>

注:

プロパティ (前の例の $movies->movie) は配列ではなく、反復可能でアクセス可能なオブジェクトです。

例 5 属性の使用

ここまででは、要素名とその値を読み取る作業のみを説明しました。SimpleXML は、配列の要素と同じように要素の属性にアクセスすることもできます。

Ms. Coder played by Onlivia Actora
Mr. Coder played by El ActÓr

上記のルーチンは次のように出力します。 #6 要素と属性をテキストと比較する

要素または属性を文字列と比較するか、文字列を必要とする関数に渡すには、

(string) を使用して文字列にキャストする必要があります。それ以外の場合、PHP は を処理します。

<?phpinclude &#39;example.php&#39;;
$movies = new SimpleXMLElement($xmlstr);
/* Access the <rating> nodes of the first movie.* Output the rating scale, too. */
foreach ($movies->movie[0]->rating as $rating) {
switch((string) $rating[&#39;type&#39;]) { // Get attributes as element indicescase &#39;thumbs&#39;:echo $rating, &#39; thumbs up&#39;;
break;case &#39;stars&#39;:echo $rating, &#39; stars&#39;;break;}}
?>

上記のルーチンは次のように出力します:

7 thumbs up5 stars
例 #7 2 つの要素の比較

PHP 5.2.0 以降、2 つの SimpleXMLElement は同じ要素を指している場合でも異なるものとみなされます。上記のルーチンは出力します:

<?phpinclude &#39;example.php&#39;;
$movies = new SimpleXMLElement($xmlstr);
if ((string) $movies->movie->title == &#39;PHP: Behind the Parser&#39;) {print &#39;My favorite movie.&#39;;}
echo htmlentities((string) $movies->movie->title);?>
例 #8 スラッシュの 1 つを使用します。

上記のルーチンは出力します:

My favorite movie.PHP: Behind the Parser

例 #9 SimpleXML のデータは定数である必要はありません。オブジェクトでは、そのすべての要素を操作できます。

<?phpinclude &#39;example.php&#39;;
$movies1 = new SimpleXMLElement($xmlstr);$movies2 = new SimpleXMLElement($xmlstr);
var_dump($movies1 == $movies2); // false since PHP 5.2.0?>
上記のルーチンは次のように出力します:

bool(false)

例 #10 要素と属性の追加

PHP 5.1.3 以降、SimpleXML には子と属性を簡単に追加する機能が備わっています。 .

<?phpinclude &#39;example.php&#39;;
$movies = new SimpleXMLElement($xmlstr);
foreach ($movies->xpath(&#39;//character&#39;) as $character) {
echo $character->name, &#39;played by &#39;, $character->actor, PHP_EOL;}?>
上記のルーチンは次の出力を行います:

Ms. Coder played by Onlivia Actora
Mr. Coder played by El ActÓr

例 #11 DOM の相互運用性

PHP には、SimpleXML 形式と DOM 形式の間で XML ノードを変換するメカニズムがあります。この例では、DOM 要素を SimpleXML に変更する方法を示します。

<?phpinclude &#39;example.php&#39;;$movies = new SimpleXMLElement($xmlstr);
$movies->movie[0]->characters->character[0]->name = &#39;Miss Coder&#39;;
echo $movies->asXML();?>
上記のルーチンは出力します:

3e5184b51d19bd3b3173071244ff71fe
eab6e99f51fee68293d1126fa516c747
 8adf8e6c41d19c74d254355bd9d9c69e
  b2386ffb911b14667cb8f0f91ea547a7PHP: Behind the Parser6e916e0f7d1e588d4f442bf645aedb2f
  c3ae6056e653b437c6b27357b7e7671a
   db0c08544b71179f3fd0e855bd613a1b
    8a11bc632ea32a57b3e3693c7987c420Miss Coderdf406f776eecbaf16b62325323196f14
    194eaccae6455d5c407b1ac2afe04cd0Onlivia Actorac0d1bcc4fa4e9e034ebc23e1ef89e5c2
   66707054a46c2dec1bf24d9318ba1124
   db0c08544b71179f3fd0e855bd613a1b
    8a11bc632ea32a57b3e3693c7987c420Mr. Coderdf406f776eecbaf16b62325323196f14
    194eaccae6455d5c407b1ac2afe04cd0El Act&#xD3;rc0d1bcc4fa4e9e034ebc23e1ef89e5c2
   66707054a46c2dec1bf24d9318ba1124
  aabc3226380a602ad187eb87d5efa83f
  a82a54010e8e844b28dec6f52c796df1
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  fa8825681e04013deb51ef36ab6dbac6
  54a9d3919a9de3703b391ab1e4eaee87
   15a73cc5312745b1b00671f6e690e36aPHP solves all my web problems6e6d7ec7f2f63fbe473136c2c34a55b7
  c0dd7eda886ba0d09f5a00454545474c
  e27af9d8c16e5d4022ce762c86f195be79df14055a92f49c29299ca2d367bde62
  b724a65f9508b61211142b27c8620c4659df14055a92f49c29299ca2d367bde62
 96664a6d22a82ab9c28a528afca408bc
c3a75a871bc1ee80ecb54700c0759808

XML エラーの処理

例 #1 破損した XML 文字列の読み込み

<?phpinclude &#39;example.php&#39;;$movies = new SimpleXMLElement($xmlstr);
$character = $movies->movie[0]->characters->addChild(&#39;character&#39;);$character->addChild(&#39;name&#39;, &#39;Mr. Parser&#39;);
$character->addChild(&#39;actor&#39;, &#39;John Doe&#39;);
$rating = $movies->movie[0]->addChild(&#39;rating&#39;, &#39;PG&#39;);$rating->addAttribute(&#39;type&#39;, &#39;mpaa&#39;);
echo $movies->asXML();?>
上記のルーチンは出力します:

3e5184b51d19bd3b3173071244ff71fe
eab6e99f51fee68293d1126fa516c747
 8adf8e6c41d19c74d254355bd9d9c69e
  b2386ffb911b14667cb8f0f91ea547a7PHP: Behind the Parser6e916e0f7d1e588d4f442bf645aedb2f
  c3ae6056e653b437c6b27357b7e7671a
   db0c08544b71179f3fd0e855bd613a1b
    8a11bc632ea32a57b3e3693c7987c420Ms. Coderdf406f776eecbaf16b62325323196f14
    194eaccae6455d5c407b1ac2afe04cd0Onlivia Actorac0d1bcc4fa4e9e034ebc23e1ef89e5c2
   66707054a46c2dec1bf24d9318ba1124
   db0c08544b71179f3fd0e855bd613a1b
    8a11bc632ea32a57b3e3693c7987c420Mr. Coderdf406f776eecbaf16b62325323196f14
    194eaccae6455d5c407b1ac2afe04cd0El Act&#xD3;rc0d1bcc4fa4e9e034ebc23e1ef89e5c2
   66707054a46c2dec1bf24d9318ba1124
  db0c08544b71179f3fd0e855bd613a1b8a11bc632ea32a57b3e3693c7987c420Mr. Parserdf406f776eecbaf16b62325323196f14194eaccae6455d5c407b1ac2afe04cd0John Doec0d1bcc4fa4e9e034ebc23e1ef89e5c266707054a46c2dec1bf24d9318ba1124aabc3226380a602ad187eb87d5efa83f
  a82a54010e8e844b28dec6f52c796df1
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  fa8825681e04013deb51ef36ab6dbac6
  54a9d3919a9de3703b391ab1e4eaee87
   15a73cc5312745b1b00671f6e690e36aPHP solves all my web problems6e6d7ec7f2f63fbe473136c2c34a55b7
  c0dd7eda886ba0d09f5a00454545474c
  e27af9d8c16e5d4022ce762c86f195be79df14055a92f49c29299ca2d367bde62
  b724a65f9508b61211142b27c8620c4659df14055a92f49c29299ca2d367bde62
 8f35ab349d6453d281f32443bf3504f4PG9df14055a92f49c29299ca2d367bde6296664a6d22a82ab9c28a528afca408bc
c3a75a871bc1ee80ecb54700c0759808

3 つの関連関数

simplexml_import_dom — 入手domnode.

simplexml_load_fileからのシンプルなオブジェクト - xmlファイルをオブジェクトに解釈します

simplexml_load_string - xmlの文字列をオブジェクト、関連するクラスおよびメンバー機能に解釈しますclass

SimpleXMLE element::addAttribute — SimpleXML 要素に属性を追加します

SimpleXMLElement::addChild — XML ノードに子要素を追加します
  • SimpleXMLElement::asXML — 整形式のsimplexml要素に基づくxml文字列elements simplexmlement ::属性 - 要素の属性を識別するcimplexmlement :: children - 与えられたnodeの子どもを見つけます:simplexmlelement :: __ construment - 新しいsimplexmlelementオブジェクトを作成します
  • SimpleXMLElement::count — 要素の子をカウントします
  • SimpleXMLElement::getDocNamespaces — document で宣言された名前空間を返します

SimpleXMLElement::getName — XML 要素の名前を取得します

SimpleXMLElement::getNamespaces — ドキュメントで使用されている名前空間を返します
  • SimpleXMLElement::registerXPathNamespace — 次の XPath クエリのプレフィックス/ns コンテキストを作成します

  • SimpleXMLElement::saveXML — 别名 SimpleXMLElement::asXML

  • SimpleXMLElement::__toString — 文字列の内容を返します

  • SimpleXMLElement::xpath — XML データに対して XPath クエリを実行します

SimpleXMLIterator类

  • SimpleXMLIterator::current — 現在の要素を返します

  • SimpleXMLIterator::getChildren — サブ要素を返します現在の要素の

  • SimpleXMLIterator::hasChildren — 現在の要素にサブ要素があるかどうかを確認します

  • SimpleXMLIterator::key — 現在のキーを返します

  • SimpleXMLIterator::next — 次の要素に移動します

  • Simple XMLイテレータ:: rewind — 最初の要素に巻き戻します

  • SimpleXMLIterator::valid — 現在の要素が有効かどうかを確認します

以上はPHP扩展のXML操作(一)—SimpleXMLの内容、その他の内容请关注PHP中文网(www.php.cn)!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。