XMLをPHPでパース

2種類のパース方法

simplexml_load_file()

  • 特徴: シンプルな記述で、階層構造の要素や値をすぐ取得できる。
  • 向いているケース:
    • 階層が深くても、要素名が分かっていて直接アクセスしたい場合。
    • XPathも使えるが、複雑な操作や属性の細かい制御はやや苦手。

DOMDocument

  • 特徴: XMLのノードを細かく操作できる。属性や名前空間、ノードの追加・削除なども柔軟。
  • 向いているケース:
    • 名前空間や属性の扱いが多い場合。
    • ノードの追加・削除・編集など、XML構造自体を変更したい場合。
    • 複雑なXPathや詳細な検索が必要な場合。

結論
値の取得や簡単な検索なら simplexml_load_file() が手軽でおすすめ
XMLの編集や複雑な検索・名前空間の厳密な扱いが必要なら DOMDocument が向いています
階層が深いだけなら、まずは simplexml_load_file

XMLをSimpleXMLElementでパース後

要素までの呼び方

目的の項目までの指定方法は、一般的に「パス(path)」や「階層(hierarchy)」と呼ばれる
XMLの場合:「ノードパス」「XMLパス」「階層」などと呼ばれます。XPath(エックスパス)という正式なパス指定方法もあります。
JSONの場合:「パス」「プロパティパス」「キーの階層」などと呼ばれます。JSONPath(ジェイソンパス)というパス指定方法もあります。

2種類のパース、中身

どちらの方法でも**最終的に $obj は同じ型(SimpleXMLElementオブジェクト)**になります。

XPath

目的の要素を簡単に検索するためのメソッドとして XPath を使うことができます。
たとえば、$obj->xpath(‘パス’) で目的の要素を配列で取得できます。
xpath() メソッドは SimpleXMLElement オブジェクトで利用できます。

属性付き要素の指定

refID=”1″ のような属性を持つ要素をXPathで指定する場合、以下のように書きます。

すべての WaveHeightForecastPart 要素のうち、refID 属性が “1” のものを取得します。
このように、[@属性名=”値”] で属性値を指定できます。

名前空間

XMLに名前空間(xmlns属性)がある場合、SimpleXMLElementのxpathはそのままでは要素を見つけられません。

<Report xmlns=”http://xml.kishou.go.jp/jmaxml1/” xmlns:jmx=”http://xml.kishou.go.jp/jmaxml1/” xmlns:jmx_add=”http://xml.kishou.go.jp/jmaxml1/addition1/”>

この xmlns や xmlns:○○ で始まる属性が「名前空間(namespace)」を定義している部分です。
xmlns=”…” はデフォルト名前空間
xmlns:jmx=”…” や xmlns:jmx_add=”…” はプレフィックス付き名前空間
この名前空間があると、XPathで要素を検索する際に特別な指定が必要になります。

要素値がわかっている場合のパスの取得例

この関数は、最初に与えた要素(例:$obj->Body)から再帰的に探索します。
完全なXPath(ルートからのパス)を取得したい場合は、$obj から再帰的にたどる必要があります。
属性値や複数同名要素がある場合は、さらに工夫が必要です。

要素値がわかっている場合のパスの取得例(複数条件)

例:【12時から18時まで】の【内陸】の【降水確率】を取得したい場合

コメント

タイトルとURLをコピーしました