アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPのXML操作で、すでにあるXMLの置換をしたいと思っています。

$doc=DOMDocument::load('test.xml');
$hoge=$doc->getElementsByTagName('hoge')->item(0)->firstChild;
$hoge->replaceData(0,1000,$_POST['hogehoge']);

このような感じで置換はできるのですが、
中身が空の場合は置換できずにエラーになってしまいます。
単純にappendDataやinsertDataにすればいいのかと思ったのですが
それでもエラーになってしまいます。

こういう場合はどういう対処をすればいいのでしょうか?
そもそも空というのがあるのはいけないのでしょうか・・・?

どうぞよろしくお願いいたします。

A 回答 (1件)

そりゃあ,ない時は$hogeはnullだから当然だわな。


http://www.w3.org/TR/DOM-Level-3-Core/core.html# …
通常こういう場合,

textContentプロパティから
文字列を取ってきて(テキストノードがない時は空文字列が返る)
http://www.w3.org/TR/DOM-Level-3-Core/core.html# …
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("<hoge>aaa</hoge>");
/*
個人的なこといえばルート要素は$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だったら空文字列のテキストノードを追加してみた。

#俺はこういう回避策的なコード好きじゃないんだよなあ…。
#ま、参考までに
*/
?>

ってなコード書いたけどさ
    • good
    • 0
この回答へのお礼

こんなに時間がたってしまって申し訳ないのですが・・・
無事、解決できました!

遅くなってすみません(^^;)
ありがとうございました!

お礼日時:2009/07/30 11:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!