DomDocument::loadXMLでエンコードの設定が消える件

さっきのjson2xmlで、phpのDomDocumentのloadXMLにハマりました。

以下がはまったサンプルコードと出力になります。

< ?php
$dom = new DomDocument('1.0', 'utf-8');
$dom->loadXML("taichino< /name>25");
$dom->formatOutput = true;
echo $dom->saveXML();
?>
 

< ?xml version="1.0" encoding="utf-8" ?>

  taichino
  25



< ?xml version="1.0" ?>

  taichino
  25

何故かエンコーディングの設定が消えてしまいます。環境の問題だと思い込んで、phpinfoやらphp.iniやら色々確認してみたものの何が原因か解りません。

そこで念の為以下のコードを走らせると正常の挙動を示しました。

$dom = new DomDocument('1.0', 'utf-8');
echo $dom->saveXML();

< ?xml version="1.0" encoding="utf-8" ?>

まさかと思いましたが、結局loadXML後にencodingを指定したら動きました。
コンストラクタでパラメータ設定できないので、loadXMLを静的呼出に合わせて変更するのが正解でしょうか。

< ?php
$dom = DomDocument::loadXML("taichino< /name>25< /age>< /root>");
$dom->encoding = 'utf-8'; // ロードしてからエンコーディング設定。釈然としないけども。。
$dom->formatOutput = true;
echo $dom->saveXML();
?>

今回ハマった理由はphpマニュアルのloadXMLの説明に以下の記述があったからです。

このメソッドをスタティックにコールすると、読み込んだ内容をもとに DOMDocument オブジェクトを作成します。読み込み前に DOMDocument のプロパティを 設定する必要がない場合に、スタティックに実行することがあるでしょう。

いやいや、コレは読み込み前にプロパティ設定できるって思いますやん。マニュアルに騙された!

というわけで何が正しいか常に意識しながら生きていかねばなりません。思い込みで選択肢を消してはなりませぬ!

試したのはphp5.1.6と5.2.8です。既になおってたらごめんなさい。

1 thought on “DomDocument::loadXMLでエンコードの設定が消える件”

  1. If you choose to hire a professional web designer for help, they may also be able to help you with this.
    As long as you believe in your idea and your unique marketing angle, you will be
    fine. For example, if you are hosting your site on a shared server, someone abusing the server may cause the server
    to go down temporarily.

Leave a Reply

Your email address will not be published. Required fields are marked *