とぎぷろべい

包丁研ぎとプログラミングと米国株投資についてのなんやかんや

XMLファイルの読み込みと書き出しについて(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1におけるXMLファイルの読み込みと書き出しについて

 

①②のphpファイルに読み込ませるXMLファイル(aa.xml)。

<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item>
    <name>うどん</name>
    <price>600</price>
  </item>
  <item>
    <name>そば</name>
    <price>500</price>
  </item>
  <item>
    <name>ラーメン</name>
    <price>550</price>
  </item>
</items>

 

②aa.xmlファイルのデータを読み込んで書き出すPHPファイル。

<?php

$a = simplexml_load_file('aaa/aa.xml');  //aa.xmlを$aに呼び出す

foreach ($a as $b) {
  echo $b->name, 'は', $b->price, "円です\n";
}

$b = $a->addChild('item');      //aa.xmlに新規のitemタグを追加する
$b->addChild('name', 'かつ丼'); //その新規itemタグ内にnameタグと値を追加する
$b->addChild('price', '800');   //その新規itemタグ内にpriceタグと値を追加する

$a->asXML('aaa/aa.xml');     //addChildメソッドの処理をaa.xmlに書き込み

 

③②のPHPファイル実行後のaa.xml

<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item>
    <name>うどん</name>
    <price>600</price>
  </item>
  <item>
    <name>そば</name>
    <price>500</price>
  </item>
  <item>
    <name>ラーメン</name>
    <price>550</price>
  </item>
<item><name>かつ丼</name><price>800</price></item></items>

PHPファイルにXMLファイルを呼び出すにはsimplexml_load_file関数を使います。

この関数のパラメータに任意のXMLファイルのパスを記述して実行すると、そのXMLファイルをパースしてオブジェクトにします。

 

 

〇パースとは

パースとは、プログラムのソースコードXML文書などの「一定の文法に従って記述された複雑な構造のテキスト文書」を解析してプログラムであつかえるようなデータ構造の集合体に変換すること、らしいです。

 

 

閑話休題

 

上記②のスクリプトのforeach文は、読み込んだaa.xmlのデータを出力するための記述です。

この部分を実行すると、ターミナルには以下のような文字列が出力されます。

 

うどんは600円です
そばは500円です
ラーメンは550円です

 

ここで注意しておきたいのは、simplexml_load_file関数を使って呼び出したXMLファイルの値である600だとか500だとかの数値は、処理的にはint型ではないという点です。

simplexml_load_file関数を使って呼び出したXMLファイルの数値は、元がint型であろうがfloatであろうが問答無用で「SimpleXMLElement」という要素に置き換えられてしまいます。

 

なのでこの数値のようなint型でもfloat型でもない値を数値に変換したい場合は、型キャストをしてあげる必要があります。

 

 

$bの部分は、呼び出したaa.xmlに新しく要素を書き込むための記述です。

要素の書き込みにはaddChildメソッドを使います。
addChildメソッドはSimpleXMLElement要素に使うメソッドであり、指定した要素に子要素を追加します。

 

ただ見てのとおり、上記②のスクリプトでは追加する子要素である「item」をどの要素に追加するのかの指定がありません。

それでもこのスクリプトを実行するとaa.xmlのitemsタグの末尾に新しいitemタグが追加されているところを見ると、このメソッドは呼び出したXMLファイルの最も上位の親タグを勝手に指定しているのかもしれません。

 

仕組みを詳しく知りたい方はご自身で調べて結論を得てください。

私は正直どうでもいいので、このメソッドについてこれ以上深く調べる気力はありません。

 

 

閑話休題

 

呼び出したXMLファイルへの書き込みにはasXMLメソッドを使います。

asXMLメソッドはSimpleXMLElement要素に使うメソッドであり、親オブジェクトのデータをXMLファイルに書き出します。

 

今回は、addChildメソッドで指定したデータがaa.xmlのitemsタグの末尾に子要素として書き込まれることになります。

このスクリプトを実行した後のaa.xmlが上記の③になるのですが、確かに末尾に指定したデータが追加されていることを確認できます。

 

しかしこの方式で追加したデータは、ご覧のようにインデント等の処置は一切なしで追加されてしまいます。

はっきり言ってかなり見づらい構成ですが、これはどうやら我慢するしかないようです。

 

 

以上です。