My Photo

« Facebookで自分の過去の投稿やいいね!を見る | Main | ばらかもん、東京喰種 »

September 11, 2014

PHPメモ045:XML処理 その1 XMLをパースする

PHPでXMLをパースするには、XMLファイルを読んでパースする場合は simplexml_load_file()、XML文字列をパースする場合は simplexml_load_string() を使用する。

SimpleXMLElement simplexml_load_file(
  string $filename
  [, string $class_name = "SimpleXMLElement"
  [, int $options = 0
  [, string $ns = "" [, bool $is_prefix = false ]]]])

filename XMLファイルへのパス
class_name  指定されたクラスのオブジェクトを返す。このクラスは SimpleXMLElement クラスを継承していなければならない。
options PHP 5.1.0 と Libxml 2.6.0 から、追加の Libxml パラメータ を指定する。
ns 名前空間プレフィックスあるいはURI。
is_prefix  ns がプレフィックスである場合に TRUE、 URI である場合に FALSE。デフォルトは FALSE。

SimpleXMLElement simplexml_load_string (
  string $data
  [, string $class_name = "SimpleXMLElement"
  [, int $options = 0
  [, string $ns [, bool $is_prefix = false ]]]] )

data XML文字列。

以下にサンプルコードを示す。

$str = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<Results xmlns="http://into.cocolog-nifty.jp/">
  <NumberOfResults>2</NumberOfResults>
  <Island>
    <IslandId>1</IslandId>
    <IslandName>西表島</IslandName>
    <Prefecture>沖縄</Prefecture>
  </Island>
  <Island>
    <IslandId>2</IslandId>
    <IslandName>奄美大島</IslandName>
    <Prefecture>鹿児島</Prefecture>
  </Island>
</Results>
XML;

$xml = simplexml_load_string($str);

print "xml=\n";
var_dump($xml);

print "\n-----\nxml->NumberOfResults=\n";
var_dump($xml->NumberOfResults);

print "\n-----\nxml->Island=\n";
var_dump($xml->Island);

print "\n-----\n";
$i = 0;
foreach ($xml->Island as $v) {
	print "foreach xml->Island:{$i}=\n";
	var_dump($v);
	$i++;
}

実行結果は以下のようになる。

xml=
object(SimpleXMLElement)#1 (2) {
  ["NumberOfResults"]=>
  string(1) "2"
  ["Island"]=>
  array(2) {
    [0]=>
    object(SimpleXMLElement)#2 (3) {
      ["IslandId"]=>
      string(1) "1"
      ["IslandName"]=>
      string(9) "西表島"
      ["Prefecture"]=>
      string(6) "沖縄"
    }
    [1]=>
    object(SimpleXMLElement)#3 (3) {
      ["IslandId"]=>
      string(1) "2"
      ["IslandName"]=>
      string(12) "奄美大島"
      ["Prefecture"]=>
      string(9) "鹿児島"
    }
  }
}

-----
xml->NumberOfResults=
object(SimpleXMLElement)#3 (1) {
  [0]=>
  string(1) "2"
}

-----
xml->Island=
object(SimpleXMLElement)#3 (3) {
  ["IslandId"]=>
  string(1) "1"
  ["IslandName"]=>
  string(9) "西表島"
  ["Prefecture"]=>
  string(6) "沖縄"
}

-----
foreach xml->Island:0=
object(SimpleXMLElement)#4 (3) {
  ["IslandId"]=>
  string(1) "1"
  ["IslandName"]=>
  string(9) "西表島"
  ["Prefecture"]=>
  string(6) "沖縄"
}
foreach xml->Island:1=
object(SimpleXMLElement)#5 (3) {
  ["IslandId"]=>
  string(1) "2"
  ["IslandName"]=>
  string(12) "奄美大島"
  ["Prefecture"]=>
  string(9) "鹿児島"
}

結果で不思議なのはコードの27行目 var_dump($xml->Island) の出力結果。var_dump($xml) の出力から考えると配列のように出力されると予想していたが、実際は最初の要素だけが出力される。さらに不思議なのは31行目 foreach では今度は配列のように要素を1個ずつ処理していくことができる。
参考ページ2にはmovies要素の下にmovie要素が複数あるXMLをパースしたSimpleXMLElementオブジェクトについて、

注意: プロパティ (先ほどの例の $movies->movie) は配列ではありません。反復処理 と 配列形式でのアクセス ができるオブジェクトです。

とあった。上記のサンプルコードについても var_dump($xml) の出力のIslandプロパティの部分は配列であるかのように出力されるが、実際は配列みたいに使えるだけであって配列ではないということらしい。
Smartyを使って $xml->Island の要素をすべて表示するPHPのサンプルコードとテンプレートの例を以下に示す。まずPHPのコード。

$smarty->assign('results', $xml);

次にテンプレート。

<ul>
{foreach $results as $v}
  <li>{$v->IslandId}:{$v->IslandName}({$v->Prefecture})</li>
{/foreach}
</ul>

参考ページ:
1.PHP: SimpleXML - Manual
2.PHP: 基本的な SimpleXML の使用法 - Manual

« Facebookで自分の過去の投稿やいいね!を見る | Main | ばらかもん、東京喰種 »

PHP」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/60300249

Listed below are links to weblogs that reference PHPメモ045:XML処理 その1 XMLをパースする:

« Facebookで自分の過去の投稿やいいね!を見る | Main | ばらかもん、東京喰種 »

August 2017
Sun Mon Tue Wed Thu Fri Sat
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof