1. 導入
PHPで外部システムとの連携や設定ファイルの読み込みを行う際、XML形式のデータを扱う場面は依然として多いです。しかし、標準的なDOM操作は記述が冗長になりがちで、複雑な構造のデータから特定の要素を探し出すのに苦労することも少なくありません。本記事では、PHPの標準クラスであるDOMDocumentと、効率的な検索を可能にするDOMXPathを活用した、実務で役立つXML操作手法を解説します。
2. 基礎知識
DOMDocumentは、XMLドキュメントをメモリ上にツリー構造として展開し、ノード単位で操作するためのクラスです。
- nodeValue: ノードの中身(テキスト)を取得・編集します。
- getAttribute(): XMLタグの属性(idやclassなど)を取得します。
- DOMXPath: XMLツリーに対して、パス指定による検索(XPath)を行うためのクラスです。これを利用することで、ループを使わずに目的のデータをピンポイントで抽出できます。
3. 実装/解決策
XML操作の基本は「読み込み」「検索・抽出」「編集・追加」の3ステップです。
特に検索においては、単純なタグ取得(getElementsByTagName)だけでなく、XPathを用いたクエリを推奨します。XPathを使えば、特定の属性値を持つ要素や、特定のテキストを含む要素を直感的な記法で絞り込むことが可能です。
4. サンプルプログラム
以下は、属性を指定してノードを検索し、その内容を書き換えて保存する実用的なコード例です。
preserveWhiteSpace = false;
$dom->formatOutput = true; // 出力時にインデントを付ける
// XML文字列からロード(ファイルの場合は load(‘path.xml’) を使用)
$xmlData = ‘
$dom->loadXML($xmlData);
// DOMXPathの初期化
$xpath = new DOMXPath($dom);
// XPathでid=”2″のノードを検索
$nodeList = $xpath->query(‘//sample[@id=”2″]’);
if ($nodeList->length > 0) {
$targetNode = $nodeList->item(0);
// 内容を書き換え
$targetNode->nodeValue = ‘blue’;
// 新しい子要素を追加
$newNode = $dom->createElement(‘sample’, ‘yellow’);
$newNode->setAttribute(‘id’, ‘3’);
$dom->documentElement->appendChild($newNode);
}
// 編集後のXMLを表示
echo $dom->saveXML();
?>
5. 応用・注意点
現場での開発において陥りやすいポイントをまとめました。
- コンテキストノードの指定: XPathで検索を行う際、クエリの第2引数にコンテキストノード(特定の親要素など)を渡すことで、検索範囲を限定できます。その際、クエリを「//title」とするとルートからの検索になってしまうため、必ず「.//title」のように「.(現在位置)」から始める相対パスを指定しましょう。
- エンコーディング: XMLの内容とPHPの文字コードが一致していないと、文字化けや解析エラーの原因になります。常にUTF-8で統一することをお勧めします。
- 削除処理: 子ノードを削除する際は、対象ノードのparentNodeを参照し、親からremoveChild()を呼び出す必要があります。ノード自身には自分を消すメソッドはないため注意してください。
XPathを使いこなすことで、複雑なXML構造も非常にシンプルに処理できるようになります。ぜひ日々の開発に取り入れてみてください。