質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

6530閲覧

phpでのxml要素削除の方法が分かりません

xxx_aoi

総合スコア38

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/08/18 13:04

編集2016/08/19 14:57

xmlのファイル

<?xml version="1.0" encoding="Shift-Jis" ?> <root> <section id =0001 name="ああああ"/> <root> 内の <section id =0001 name="ああああ"/> といった複数の属性を持つ要素をphpで削除したいのですが、方法がわかりません。 参考としたページ: [http://www.weblio.jp/content/DOMNode-%3EremoveChild()]

ただこれを読んでももともとどこにcaptionタグがあってどのように削除されたのかがよくわかりませんでした。
また、unsetを使った方法も試したんですが:
参考サイト:
[http://www.technotype.net/tutorial/tutorial.php?fileId=%7BPHP%7D&sectionId=%7Bremoving-the-element-and-attribute-node%7D]

<section>ああああ</section>といった属性1つだけの時では削除できる(xmlファイル自体では消えてないがブラウザ表示では消えてる)んですが、やはり多くの属性を含んだ要素の場合は消せません。

どういった方法なら消えるのか教えていただけますでしょうか?
ちなみにパーミッション666で行っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/08/18 19:30

ご自身で書かれたコード及び対象のXML、最終的にどのようなXML(結果)にしたいのかをコードブロックで質問文に追記いただいたほうが回答を得られやすいと思います。また、リンクが一部不正確なためどこを参照されたかがわかりません。URLを確認し、リンクを貼ってください。リンク先に有るという「captionタグ」も見当たりませんので、ご確認ください。
xxx_aoi

2016/08/19 13:59

確かにそうだと思ったんですが、とにかく知りたいのは上に書いたsectionのタグが消えさえすればいいので、他に記述がなくても大丈夫かなと判断していました。 そしてurlを修正しました。ご指摘ありがとうございます。 また、「caption」タグではなく、chapterでした。大変失礼しました。
kei344

2016/08/19 14:07

URLにはリンクを張ることができますので、編集よろしくお願いします。また、もともとどこにsectionタグがあるかによって処理も変わるので、XMLとどのような結果にしたいかというのは重要だと思うので、かかれたほうが良いと思いますよ。
xxx_aoi

2016/08/19 14:59

ご指摘いただいだ通りに直しました(でもリンクはうまくいっていないような・・・)。コードも簡単ですが他の部分も書いときました。ありがとうございます。
guest

回答5

0

リンク先は全く読んでいませんが・・・。
こういう感じでしょうか。
xpathのところは実際のXMLに合わせて修正してください。

PHP

1//$sxe = new SimpleXMLElement($xml); 2$sxe = simplexml_load_file($xml_file); 3foreach($sxe->xpath('/root/section') as $value){ 4 unset($value[0]); 5}

投稿2016/08/19 00:49

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxx_aoi

2016/08/19 13:47

すみません、それリンク先と同じで、それだと今回の場合通用しませんでした・・・。 リンク先の内容も本文に載せてなくてすみませんでした。
ttyp03

2016/08/21 23:32

通用しないという「今回の場合」のXMLを提示いただけますか。 その方が話は早いと思います。
guest

0

ベストアンサー

<section>ああああ</section>といった属性1つだけの時では削除できる(xmlファイル自体では消えてないがブラウザ表示では消えてる)んですが、やはり多くの属性を含んだ要素の場合は消せません。

属性の個数によって挙動が変化することは考えられませんし,実際あなたが「通用しません」と判断されたものに関しても私は動作確認がとれています.何か根本的な勘違いをされていませんか?

  • HTMLとしてWebブラウザによって解釈されたあとのものをWebブラウザで確認している場合は,

「ソースを表示」からテキストとして確認すべきです.というより,こういうバッチ処理的な動作確認は**phpコマンド**から行うべきであって,WebサーバやWebブラウザは本来は不必要です.

  • 読み込んだ変数をいじっただけでファイル本体が書き換わることはありません.

蛇足ですが,もし古いWebサイトがこのようなフォーマットで何かRSSなどのデータを提供しているならしょうがないですが,今からあなたが書くアプリでこれを使うことはやめたほうがいいです.

  • 文字コードがShift_JIS

(PHPではShift_JISでの完全な動作保証がない上に不便なことだらけなので,UTF-8に統一すべきです.但しWindowsのメモ帳でUTF-8で保存すると先頭に3バイトのゴミが入るので,メモ帳以外のまともなエディタを使いましょう.プログラミング用途ではメモ帳はゴミ同然です.)

  • フォーマットがXML

(最近はJSONのほうが主流ですし,PHPから扱う場合はるかにXMLより扱いやすいです.)

投稿2016/08/19 21:06

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

<section id =0001 name="ああああ"/>

idの0001はクォーテーションで囲んでいないのでしょうか?
またsectionは単体で発行して閉じるタグはないとかんがえてよいのでしょうか?

投稿2016/08/19 01:08

yambejp

総合スコア114583

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxx_aoi

2016/08/19 13:46

idは”で囲います。抜けててすいません。 sectionの閉じタグはないとお考えください。
guest

0

おかげさまで解決できました。
皆様、ご協力ありがとうございました。

投稿2016/08/22 15:44

xxx_aoi

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/08/22 15:49

どのように解決したかコードを回答欄に追記いただけませんか?このページに辿り着いた同じ疑問を持つ人のために、ぜひお願いします。
guest

0

PHP

1$xmlstr = <<<XML 2<?xml version="1.0" encoding="Shift-Jis" ?> 3<root> 4<section id ="0001" name="ああああ"/> 5<section id ="0002" name="ああああ"/> 6<section id ="0003" name="ああああ"/> 7<section id ="0004" name="ああああ"/> 8<item id ="0005">AAAAA</item> 9</root> 10XML; 11$items = new SimpleXMLElement( $xmlstr ); 12$cnt = count( $items->section ); 13while( $cnt ) { 14 $cnt--; 15 unset( $items->section[ $cnt ] ); 16} 17echo $items->asXml(); 18// <?xml version="1.0" encoding="Shift-Jis"?> 19// <root> 20// <item id="0005">AAAAA</item> 21// </root> 22var_export( $items ); 23// SimpleXMLElement::__set_state(array( 24// 'item' => 'AAAAA', 25// )) 26```**出力結果**[http://ideone.com/BfNSu7](http://ideone.com/BfNSu7)

投稿2016/08/19 16:29

kei344

総合スコア69364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問