PHPでXMLの編集・削除の方法

このQ&Aのポイント
  • PHPでXMLの編集・削除を行う方法を解説します。
  • XPathを使用して要素を指定し、削除や編集を行います。
  • 具体的なコード例や注意点も紹介します。
回答を見る
  • ベストアンサー

PHPでのXMLの編集・削除の方法

XMLの編集・削除をPHPで行いたいと思っています。 その際に、どの要素なのかを指定したいと思うのですが なかなか方法が分からずに困っています。 調べてみて、Xpathを利用して指定し 削除をする時には DOMNode = DOMNode->removeChild(ノード) 編集する時には DOMNode->nodeValue = 値 と、いうものを利用すればいいのかな?と分かってきたのですが 実際、PHPに組み込んでみても、動いてくれず分からなくなっています。 【削除PHP】 foreach ($_POST['number'] as $key => $value){ $xpath = new DOMXPath($doc); $xpath_title = $xpath->query("//title[parent::record/@number=$value]"); //要素ノードの取得 $dataElement = $doc->getElementsByTagName("title")->item(0); //削除 $dataElement->removeChild($xpath_title) or die("削除できません。"); } 【編集PHP】 $xpath = new DOMXPath($doc); $xpath_title = $xpath->query("//record/@number=$session_number"); //値の変更 $session_title = $_SESSION["title"]; $xpath_title->title->nodeValue = $session_title; print $xpath_title->title->nodeValue; 【XML】 <renew>  <record number="000000">   <title>タイトル</title>   <paragraph>内容</paragraph>  </record> </renew> 字数制限の為に、コードも必要最低限だと思われるものしか 記述していません。これでは分からないという事であれば 追記で記述しますので、分かる方は是非教えてください。 よろしくお願いします。

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

以下でどうでしょうか。 // recordノードを取得 $xpath_record = $xpath->query("//record[@number=$session_number]")->item(0); // recordノードを削除 $xpath_record->parentNode->removeChild($xpath_record);

kanan86
質問者

お礼

回答ありがとうございました!! レコード全てを削除することができました!! 本当に、感謝の気持ちでいっぱいです。 ありがとうございました!!

その他の回答 (1)

回答No.1

$xpath->query() が返すのは、DOMNodeListです。 http://jp.php.net/manual/ja/function.dom-domxpath-query.php ですので、 $xpath_title = $xpath->query(...); ではなくて、 $xpath_title = $xpath->query(...)->item(0); としなければだめです。 【削除について】 $rec = $xpath_title->parentNode; // titleの親ノードをrecに代入 $rec->removeChild($xpath_title); // recの子ノード(title)を削除 のようにします。 二行をまとめると、以下になります。 $xpath_title->parentNode->removeChild($xpath_title); 【編集について】 $xpath_title->title という書き方は、SimpleXMLなどの記法です。 削除の時と同じ方法で、XPathでtitleノードを取得して、 $xpath_title->nodeValue = "hogehoge"; としてやればよいと思います。

kanan86
質問者

補足

回答ありがとうございました! 無事、編集・削除も出来るようになりました! 本当に感謝の気持ちでいっぱいです。 ただ、大変恐縮ではあるのですが 削除のPHPをタイトルのみではなく <record>要素を丸々削除したいと考えています。 自分でも、Xpathを書き換えたり等試みてはみたのですが なかなか消す事ができません。 よろしければ、丸々削除する方法も 教えて頂ければ嬉しいです。 大変申し訳ありませんが、よろしくお願いします。

関連するQ&A

  • 出力結果が、Object id #6 と表示されてしまいます。

    次のようなPHPを書いています。 <?php  define("XMLFILE", "renew.xml");  define("XSLTFILE", "renew.xsl");  $doc = new DOMDocument("1.0","UTF-8");  $doc->formatOutput = TRUE;  $doc->load(XMLFILE) or die("ファイルを読み込めません\n");  $xpath = new DOMXPath($doc);  foreach ($_POST as $key => $value)   {    $search = $xpath->query("//title[parent::record/@number=$value]"); print ("$search"); } ?> XMLファイルから、特定の属性値を持つものだけ抽出して 取り出したいと思っているのですが、出力結果が Xpathで指定したタグの内容でなく、Object id #6 もしくは Object id #4 と、表示されてしまいます。 どこを修正すれば、きちんと指定タグ内の内容が出力されるのか 分からずに困っています。 ちなみに、抽出したいXMLの構造は下記の通りです。 <?xml version="1.0" encoding="utf-8" standalone="yes"?> <root> <record number="061120143813"> <date>06/11/20 14:38</date> <title>わっほぃ!</title> <paragraph>更新情報第一弾!</paragraph> </record> <record number="061120144146"> <date>06/11/20 14:41</date> <title>あいうえお</title> <paragraph>あいうえおえ</paragraph> </record> </root> 申し訳ありませんが、分かる方いらっしゃいましたら 教えてください、よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP5 XML クエリ 

    PHP5でXMLのテストをしているのですが、わからないことがあります。 --- test.xml <A> <B> <C>TEST</C> <D> <E>1</E> <F>2</F> <G>3</G> </D> </B> </A> <?php $doc = new DOMDocument; $doc->preserveWhiteSpace = false; $doc->Load('test.xml'); $xpath = new DOMXPath($doc); $query = '//A/B/D/E'; $entries = $xpath->query($query); foreach ($entries as $entry) { echo "$entry->nodeValue\n"; } で1が返されますが、 $query = '//A/B/D/E'; で、Eのノードを決め打ちしているので、foreachで回すのが気に入らないのですが この方法が一般的でしょうか? $e = なんとか??; で$entries = $xpath->query($query); のあと、取得できないでしょうか? あと、クエリという使い方で例えば2以上データを取得する この場合はF,Gの要素を取得するクエリの記述方法が知りたいです。

    • ベストアンサー
    • 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
  • removeChildを使っても変化なし PHP5.0

    idが条件に合ったら子ノードを削除する。という簡単なことをしたいのですが、サンプルソースをコピーして簡単なソースを作りましたが、何を変えてもエラーメッセージも出なければ、XMLファイルに変化もありません。 どなたか詳しい方削除ができない理由を教えてください。 books.xml <?xml version="1.0" ?> <data> <p><name id="1">aaaa</name><ad>1111</ad></p> <p><name id="2">bbbb</name><ad>2222</ad></p> <p><name id="3">cccc</name><ad>3333</ad></p> <p><name id="4">dddd</name><ad>4444</ad></p> <p><name id="5">eeee</name><ad>5555</ad></p> <p><name id="6">ffff</name><ad>6666</ad></p> </data> xmltest.php <?php //ドキュメントオブジェクトの作成 $doc = new DOMDocument(); //XML 文書ファイルのパース(DOM ツリーの作成) $doc->load("books.xml"); $id='3'; //DOMXPath オブジェクトの作成 $xpath = new DOMXPath($doc); //ローケーションパスの作成 $query = "/data/p[name[@id='$id']]"; //XPath を評価する 戻り値は、DOMNodeList $nodeList = $xpath->query($query); $pNode = $nodeList->item(0); //print $pNode -> textContent; //"data"要素ノードの取得 $dataElement= $doc->getElementsByTagName("data")->item(0); //print $dataElement -> textContent; //データを削除する $dataElement->removeChild($pNode); ?> これでidが3の行を消したいです

    • 締切済み
    • XML
  • ノードの削除

    フォームから送信した内容に対応するノードを DOMツリーから削除する方法が思いつかず困ってます。 var kekka = root.selectNodes(XPath); のようにして直接ノードリストを取得しています。 ●.removeChild(▲)を利用してノードが削除できることはわかるのですが、 今回の場合の、●▲に入る変数がまったく検討がつきません。

  • XMLとの連携でノードの長さを取り出す方法

    PHP--------------------------------------------- $xpath = "/qq:album/img"; $xpath = mb_convert_encoding($xpath,"UTF-8","SJIS"); $x_array = $ctx->xpath_eval($xpath); $title_element = $x_array->nodeset[0]; $title = $title_element->get_attribute("title"); $title = mb_convert_encoding($title,"SJIS","UTF-8"); XML---------------------------------------------- <?xml version="1.0" encoding="EUC-JP"?> <qq:album xmlns:qq="www.phpdom.com"> <img title="ABC"> <img title="DEF"> <img title="GHI"> <img title="JKL"> </qq:album> こんにちは。 http://www.geocities.jp/xmlfirststep/dom/dom4.html のサイトを参考に、上のようなスクリプトを書きました。albumという名の親ノードの下にあるimgノードの要素titleを抜き出すものです。このimgノードをXMLで複数つくり、phpでその長さを自動で返してもらおうと思ったのですがそのやり方がわかりません。 色々なサイトを回りましたが、キーワード「length」で探してもそれらしき情報がまったく見つかりません。 どうすればノードの長さを返してもらえるのでしょうか?

    • ベストアンサー
    • PHP
  • PHPでのXML操作について

    お世話になります。 PHPを少し触れる程度の初心者です。 現在PHPで既存のXMLファイルへの書き込み・削除などの編集が出来ないかと方法を探っているのですが、DOMを使うやXpathを使う、他にも色々と書かれていて少々混乱気味です。 PHP5だけで、例えば以下の様な事は可能なのでしょうか? (1) <?xml version='1.0'?> <DataSet>  <Table>   <name>○○○</name>   <auther>×××</auther>  </Table> </DataSet> というXMLファイルがあった場合、 (2) <?xml version='1.0'?> <DataSet>  <Table>   <name>○○○</name>   <auther>×××</auther>  </Table>  <Table>   <name>△△△</name>   <auther>×××</auther>  </Table> </DataSet> という様な追加。 そして再び元の(1)へ戻す様な削除です。 PHPだけでは不可能である場合、一番分かり易く簡単だと思われる方法を、どなたか分かり易くご教授願えないでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • DOMDocumentの文字化けに悩まされています

    cURLを使った場合のエンコードに悩まされています。 $http = new SimplecURL($url); /*cURLを使って指定ページのhtmlを取得する自己関数*/ $html = $http->execute(); $html = mb_convert_encoding($html, "UTF-8", "auto"); この後、取得したHTMLを、 $doc = new DOMDocument(); @$doc->loadHTML($html); $xpath = new DOMXPath($doc); //body部から該当するUrlを抽出 $extracts = $xpath->query($xPath); foreach ($extracts as $value) { $results = trim($value->nodeValue); $results[] = $result; } のようにして取得しているのですが、日本語が文字化けする場合が非常に多いです。 $html = mb_convert_encoding($html, "UTF-8", "auto"); とか、 $result = mb_convert_encoding($result, 'UTF-8', 'auto'); とかするのですがダメです。 色々なサイトでそうなのですが、例えばShift-JISで書かれていると思われる http://www.nhk.or.jp/worldwave/abc/popup/abc120528.html などでも日本語を //div[@class=\"paragraph clearfix\"]//p[@class=\"ja\"]/text() のようなxPathで取得すると文字化けして出てきます。 mb_convert_encoding($html, "UTF-8", "Shift-JIS")のようにしてもダメです。 どのようにすれば解決するのでしょうか? アドバイスを頂けないでしょうか?

    • ベストアンサー
    • PHP
  • classの属性の値がない場合の取得について

    次のようなHTMLで、divのclassが「a」内のdivのclassがない場合の要素(つまり下の例では、「ccc」)を 取得したいと思って、「class=''」を記述したのですが、これはマッチしませんでした・・・ かといって「//div[@class='a']」だけだと「<div class=b>」にもマッチしてしまいます。 この場合はどのような記述になるのでしょうか?_ $document =<<<EOF <div class=a><div class=b>bbb</div><div>ccc</div></div> EOF; $doc = DOMDocument::loadHTML($document); $xpath = new DOMXPath($doc); $items = $xpath->query("//div[@class='a']/div[@class='']"); foreach ($items as $item) { $arr[] = $item->nodeValue; } print_r($arr);

    • ベストアンサー
    • PHP
  • domでのXML作成について

    PHP4.2のdomを使い、下記のようなXMLを作成したいです。 しかし、Itemのノードに対して、NUMBERとNAMEという子ノードを2つつけるやり方が分からず困っています。 PHPは書いて見たのですが、上手くいっていません。 教えていただけると助かります。 宜しくお願いします。 【作成したいXML】 <Response> <Items> <Item> <NUMBER>47</NUMBER> <NAME>沖縄県</NAME> </Item> </Items> </Response> 【PHP】 $dom = domxml_new_doc("1.0"); $Response = $dom->create_element("Response"); $root = $dom->append_child($Response); $Items = $dom->create_element("Items"); $Item = $dom->create_element("Item"); $NUMBER = $dom->create_element("NAME"); $text1 = $dom->create_text_node("47"); $NUMBER->append_child($text1); $NAME = $dom->create_element("NAME"); $text2 = $dom->create_text_node("沖縄"); $NAME->append_child($text2); $Item->append_child($NAME); $Items->append_child($Item); $root->append_child($Items);

    • ベストアンサー
    • PHP

専門家に質問してみよう