質問: phpでxmlの置換 replacedata phpのxml操作で、すでにあるxmlの置換をしたいと思っています。 $doc=domdocument::load('test.xml'); $hoge=$doc->getelementsbytagname('hoge')->item(0)->firstchild; $hoge->replacedata(0,1000,$_post['hogehoge']); このような感じで置換はできるのですが、 中身が空の場合は置換できずにエラーになってしまいます。 単純にappenddataやinsertdataにすればいいのかと思ったのですが それでもエラーになってしまいます。 こういう場合はどういう対処をすればいいのでしょうか? そもそも空というのがあるのはいけないのでしょうか・・・? どうぞよろしくお願いいたします。
回答: そりゃあ,ない時は$hogeはnullだから当然だわな。 http://www.w3.org/tr/dom-level-3-core/core.html#id-169727388 通常こういう場合, textcontentプロパティから 文字列を取ってきて(テキストノードがない時は空文字列が返る) http://www.w3.org/tr/dom-level-3-core/core.html#node3-textcontent str_replace関数 http://jp2.php.net/str_replace を通して textcontentプロパティに代入しなおす。 んだろうと思う。 ============= メモ だけど,手元のphp 6.0 200807280630で 自分のコード(ファイル作るのが面倒だったのでloadxmlメソッド使用)でtextcontentプロパティに代入後にそのプロパティを参照してprintすると代入した値になっていませんでしたorz domelementのドキュメントにもtextcontentプロパティはない #なのに未定義エラーが出ない。 ##ナイトリーでリリースではないからかもしれないのが。 http://jp2.php.net/manual/en/class.domelement.php ので回避策として php $doc=new domdocument(); $doc-loadxml("aaa"); /* 個人的なこといえばルート要素は$doc->documentelementから取得したい そうでなくてもxpathの方が(準備も使用法も引数が多くて大変だけど)好き */ $hogeelement = $doc->getelementsbytagname('hoge')->item(0); $text = $hogeelement->firstchild; if ($text === null){ $text = $hogeelement->appendchild($doc->createtextnode("")); } $text->replacedata(0,1000,"bbb"); print $doc->savexml(); /* nullだったら空文字列のテキストノードを追加してみた。 #俺はこういう回避策的なコード好きじゃないんだよなあ...。 #ま、参考までに */ ?> ってなコード書いたけどさ