• 締切済み

SimpleXMLでxmlのデータを修正するときの疑問

PHP5でflashで扱うXMLの編集をしています。 <xml> <aaa>12345</aaa> </xml> というxmlに対し、 $nodeName = "aaa"; $xml = simplexml_load_file($xmlFile); $xml->$nodeName->title = "aiueo"; という感じで、xmlの更新をしていますが、 <xml> <aaa>12345</aaa> <aaa>67890</aaa> <aaa>24680</aaa> </xml> と、xmlのnodeが同名複数になったとき、 $xml->aaa[0]->title = "aiueo"; 相当のことを、ノード名も、何番目のノードかも、 変数をつかって実行する方法はありますか? 当然のごとく、 $nodeName[$num]は、$nodeNameの配列の値とみなされますし、 $a = $nodeName . '[' . $num . ']'; $xsml->$a->title = "aiueo"; とやると、"aaa[0]"という文字列をノード名にしてデータ追加してしまいます。 ご存知の方がいらっしゃいましたら、ご教示下さい。

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

  • altrn
  • ベストアンサー率62% (10/16)
回答No.2

すいません、間違えました、 $xsml->{$nodeName[$num]}->title = "aiueo"; ではなく $xsml->{$nodeName}[$num]->title = "aiueo"; です。 見当違いでしたらお許しください...

  • altrn
  • ベストアンサー率62% (10/16)
回答No.1

質問の意味を理解していないかもしれませんが... $a = $nodeName . '[' . $num . ']'; $xsml->$a->title = "aiueo"; を $xsml->{$nodeName[$num]}->title = "aiueo"; とすればうまくいくかもしれません。

関連するQ&A

  • phpのSimpleXMLでXMLの要素を参照したい。

    フォームからキーワードを受け取り、それを、xmlを参照しながらphpで出力したいのですが、最後の最後でつまずきます。 ------------------ <?php $doc = new domDocument(); // DOMDocumentオブジェクトにより、インスタンスを生成 $doc->load("./beta.xml"); // ファイルからXML文書を読みこむ $kywd = $_REQUEST['kywd']; // フォームからデータを受け取る $nodelist = $doc->getElementsByTagName('keyword'); // 指定した要素名(keyword)の全ての要素を取得 foreach ($nodelist as $node) { // 各要素を参照 if($kywd == $node->textContent){ // もし、フォームから受け取ったデータが要素と一致したら $xurl = $node->namespaceURI; // 要素の名前空間URLを取得して$xurlに代入 $xml = simplexml_load_file("./beta.xml"); // SimpleXMLによってXMLファイルをパースし、simplexml_elementオブジェクトを作成する $parent = $xml->children("$xurl"); // 指定したノードの子ノードの配列を取得 $hairetsu = $parent[0]->children("$xurl"); //取得した配列素$hairetsuに代入 foreach($hairetsu as $key=>$value) { // ちゃんと連想配列になっているか、ためしに出力 print ($key."→".$value."<br />"); } // 連想配列になっていることを確認 print $hairetsu["title"]; // しかし、キーを指定して値を取得しようとすると、なぜか得られない。 } } ?> 問題は最後のほうです。連想配列になっていることは確かに確認できる(titleというキーも、その値もある)のですが、連想配列のキーから値を参照しようとすると、なぜか値がNULLになっていて表示できません。私は趣味でプログラミングをする程度なので、おそらく基本的なところで間違っているのだと思いますが、それがどこだか分かりません。お教え願えないでしょうか。

    • ベストアンサー
    • PHP
  • simplexml_load_fileについて

    simplexml_load_fileでrssを読み込んでいるのですが、 rssのxmlファイルが少し特殊でリンクが抜けているitemがあり、 以降ずれ込んで読まれてしまい困っています。 ■xml例 <root> <item> <title></title> <link></link> </item> <item> <title></title> <link></link> </item> <item> <title></title> ←リンクがぬけている </item> <item> <title></title> <link></link> </item> </root> ■php側 抜粋/割愛 $xml = simplexml_load_file($this->xmlPath) or die("ファイルが読み込まれません"); //xpathにて各ノードを取得 $title = $xml->xpath(//title); $link = $xml->xpath(//link); for($i = 0; $i < 3; $i++) { <a href="<?=$link[$i]?>"> <?=$title[$i]?> </a> } のように取得して、html加工して 吐き出しているので、linkがないノードがあると 後のものがどんどんずれて読み込まれてしまいます・・・ どのようにしたら解決できますでしょうか・・・

    • 締切済み
    • PHP
  • PHP5 domDocumentで簡単に深いノードを取得する。但し、SimpleXMLを使わない

    環境はPHP5です。 SimpleXML(simplexml_load_file)を使わない事情がありまして、domDocumentを使っています。 $dom = new domDocument(); $dom->load("example.xml"); $root = $dom->documentElement; foreach($root->childNodes as $elems) { if ($elems->nodeType == XML_ELEMENT_NODE && $elems->nodeName == "Items") { ... ... ... 例えば以下のようなXMLの場合、<D2>のyyyyyを取得する為に上のプログラムだと、 foreach, ifのネストが深くなり、階層が深くなるにつれてプログラムの記述も増えて 非常に面倒ですが、$rootを使って、yyyyyの値を1行程度で取得する方法ないのでしょうか? <A> <Items> <B1></B1> <B2> <C> <D1>xxxxx</D1> <D2>yyyyy</D2> </C> </B2> <B3></B3> </Items> </A>

    • ベストアンサー
    • PHP
  • simplexml_load_fileを使用してblogのRSSを読み

    simplexml_load_fileを使用してblogのRSSを読み込み、ページ内に表示させたいのですが 下記のスクリプトでは楽天とlivedoorのRSSの読み込みが出来ません。 色々検索してみたのですがこれといった解決法を発見できなかったので質問させていただきます。 どうぞよろしくお願いいたします。 <?php $xml = simplexml_load_file('RSSをここに入力'); $i = 0; foreach($xml->channel->item as $item) { if(++$i>5) break; $title = (string)$item->title ; $link = (string)$item->link ; echo ("<li><a href=".$link.">".$title."</a></li><br />"); } ?>

    • ベストアンサー
    • PHP
  • simplexmlで取得したデータを配列へ。

    PHP5のsimplexml_load_fileでデータにアクセスし、配列に 入れたいのですが、うまくいきません。 $xml = simplexml_load_file($file); $arrayA = array(); foreach($xml->A as $A){ array_push($arrayA, $A); } print_r($arrayA); とすると、 Array ( [0] => SimpleXMLElement Object ( [0] => data1 ) [1] => SimpleXMLElement Object ( [0] => data2 ) [2] => SimpleXMLElement Object ( [0] => data3 ) ) となってしまいます。 そうではなくて、 Array ( [0] => data1 [1] => data2 [2] => data3 ) とデータの中身を直接配列に入れたいのですが、 どうすればよいのでしょうか。 非常に初歩的な質問じゃないかと思うのですが、どなたがご教示 いただけますと有難いです。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • simplexmlについて初歩的なことですが助けてください。

    PHP初心者なのですが、ご教示下さい! きっと分かる方にとってはびっくりするくらい単純な話だと思うのですが・・・simplexmlでforeach中に記述した箇所がうまく出力されません・・。 基本的なやり方だと正常に行くのですが、ちょっと背伸びしてUTF-8をsjisにエンコードしたりそんな処理をはさむとダメです。(携帯サイト向けにsjisにしたいので。) 具体的には、 $xml = simplexml_load_file($url); foreach ($xml->channel->item as $item ) { $title = $item['title']; $titles = mb_convert_encoding($title, "SJIS", "UTF-8");   $data = "<h3>".$titles."</h3>\n"; } print($data); というような感じで、foreach中に$titlesの内容を出力させたいのですが、記述方法がどうも分かりません。 パースには成功していて、{$item->title}のように記述すると正常に出力されます。 どなたかアドバイスをいただけると幸いです。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHPのSimpleXMLについて

    PHPのSimpleXMLについて 閲覧ありがとうございます。PHPでSimpleXMLを用いてxmlのページを解析しているのですが <data> <item date="10/7/13" url="http://yaho.co.jp" type="sample" y="2010" m="7" d="13"> hogehoge </item> このようなサンプルがありdateとurl, hogehogeをそれぞれ$date,$url,$titleの変数に入れたいのですが方法がわかりません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • XML DOM ルートノード直下に子ノードを持つノードを追加

    XML DOMを利用して、XMLファイルにデータを追加するPHPを書いています。 リファレンス等を参照して、追加は出来るようになったのですが ルートノードが増えていってしまいます。 ::::::::::::::::::::::::::::::::::::::::::::::::::::: define("XMLFILE", "○○.xml"); header("Content-Type: text/html; charset=UTF-8"); $doc = new DOMDocument("1.0","UTF-8"); $doc->formatOutput = TRUE; $doc->load(XMLFILE) or die("ファイルを読み込めません\n"); $record = $doc->createElement("record"); $date = $doc->createElement("date","日付サンプル"); $title = $doc->createElement("title","タイトルサンプル"); $paragraph = $doc->createElement("paragraph","パラグラフ"); $number = $doc->createAttribute("number"); $number->value ="004"; $doc->appendChild($record); $record->appendChild($number); $record->appendChild($date); $record->appendChild($title); $record->appendChild($paragraph); print htmlspecialchars($doc->saveXML(), ENT_NOQUOTES); $doc->save(XMLFILE) or die("ファイルを保存できません。"); :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: どのようにすれば、ルートノードの下に新規ノードが入ってくれるのでしょうか。 どなたか教えて頂けるととても嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • VBscriptでXMLデータの抽出に関する質問

    教えて下さい。以下のようなXMLファイルがあります。 <?xml version="1.0" encoding="Shift-JIS"?> <ROOT> <INFO> <NO>0001</NO> <NAME>ABC</NAME> <COMMENT> </COMMENT> <AGE>30</AGE> </INFO> </ROOT> これを以下のようにVBScriptにてデータを取り出したいです。 Dim DOM, docRoot, node, nodeList, i, m Dim objADO, objADO2 Dim objRS Dim sqlstmt, strSQL Dim no, comment 'DOMオブジェクト生成 Set DOM = CreateObject("Microsoft.XMLDOM") '同期モード DOM.async = True 'XMLを読み込む DOM.load("11.xml") 'ルートセット Set docRoot = DOM.documentElement 'ノードの設定 Set nodeList = docRoot.selectNodes("/ROOT/INFO") 'ループ For Each node In nodeList For i = 0 to node.ChildNodes.length - 1 Select case node.childNodes(i).nodeName case "NO" no = node.childNodes(i).firstChild.nodeValue case "COMMENT" comment = node.childNodes(i).firstChild.nodeValue End select Next Next ところがCOMMENTタグのようにデータが空のものがあると 「オブジェクトがありません」とエラーになります。 if Not IsNull(node.childNodes(i).firstChild.nodeValue) then というようにもやってみましたが、これでも同じエラーとなってしまいます。 何か方法はないでしょうか?アドバイスを宜しくお願いします。

    • ベストアンサー
    • XML
  • phpからxmlに書き込みする際の改行について

    phpからxmlに書き込みする際の改行について phpに初めて触れる者です。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1326041343 ↑のサイトを参考にして下記のphpを書き、 xmlに書き込みを行ったのですが、 間に改行コード入らず困っています。 色々と調べたのですが、初心者のため出来ませんでした。 それぞれのタグの間に改行を入れるにはどうすればいいのでしょう? ご教授お願いいたします。 <?php $sxml = simplexml_load_file('test.xml'); $member_node = $sxml->addChild('member_list'); $member_node->addChild('name', '加藤茶'); $member_node->addChild('age', '66歳'); $member_node->addChild('email', 'cha@example.jp'); $sxml->asXML('test.xml');

    • ベストアンサー
    • PHP

専門家に質問してみよう