SimpleXmlを使って、idで指定した要素を消すにはどうしたらいいですか?


・DVDリストから購入済みのもの(id='bought')を非表示にしたい。
・div>ul>li>a の形のデータで、liの数は不特定。
・liの中にさらにulが含まれる場合もある。

【やってみたこと:1】→×
$xml =simplexml_load_file("dvd.xml");
unset( $xml->xpath("//li[@id='bought']") );
echo $xml->asXML();

【やってみたこと:2】→×
$xml =simplexml_load_file("dvd.xml");
foreach( $xml->xpath("//li") as $elm ){
if($elm["id"]=="bought"){ unset( $elm ); }
}
echo $xml->asXML();

要素の構造が不確定なので、何とかxpathとidで拾って削除したいです。
どうすれば消えてくれるでしょうか。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2011/01/21 11:19:50
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:la-la-land No.2

回答回数58ベストアンサー獲得回数6

ポイント40pt

必ずしもxpathにこだわらなくてもいいですよね?

ググったらsimpleXMLを使った方法で2通りくらい属性を取る方法があるようですが。

http://pugiemonn.blog6.fc2.com/blog-entry-1184.html

http://php2.g.hatena.ne.jp/py4s-tnk/20091017/1255800920

id:k_gobo

データ内容を個別に拾って整形して出力という方法ではなく、元データXHTMLの構造をそのまま利用して出力したいので、$xmlから#boughtだけ削除して吐き出したいと思っています。

2011/01/18 12:12:32

その他の回答2件)

id:kou32rr No.1

回答回数197ベストアンサー獲得回数8

細かい検証無いのですが、、、

なぜxmlなのに div>ul>li>a  の構造なのでしょうか?

xmlの構造を変えられるのかは不明ですが、

例えば

<status>bought</status>

というようなxmlの構造になってれば容易に処理できるようになると思います。

id:k_gobo

元データがXHTMLなのです。

これを変えずに拾いたいと思っています。

2011/01/18 12:10:02
id:la-la-land No.2

回答回数58ベストアンサー獲得回数6ここでベストアンサー

ポイント40pt

必ずしもxpathにこだわらなくてもいいですよね?

ググったらsimpleXMLを使った方法で2通りくらい属性を取る方法があるようですが。

http://pugiemonn.blog6.fc2.com/blog-entry-1184.html

http://php2.g.hatena.ne.jp/py4s-tnk/20091017/1255800920

id:k_gobo

データ内容を個別に拾って整形して出力という方法ではなく、元データXHTMLの構造をそのまま利用して出力したいので、$xmlから#boughtだけ削除して吐き出したいと思っています。

2011/01/18 12:12:32
id:kou32rr No.3

回答回数197ベストアンサー獲得回数8

ポイント40pt

2回目投稿になります・・・

以下の内容でテストできました。

具体的なファイル内容不明なのでダミーデータです。

■XMLファイル test.xml

  • AAの部分
  • AAの部分
  • CCの部分
  • AAの部分
  • BBの部分


■PHP test.php

$xml =simplexml_load_file("test.xml");

foreach( $xml->ul->li as $elm ){

if($elm['id'] != "bb"){

print_r( $elm );

}

}

?>

これで、bbではない要素のaaとccの結果がprint_rできます。

後は配列の加工を望む形にすればよいと思います。

  • id:kou32rr
    xmlのコードが表示されてませんね^^;

    これでどうでしょうか。

    >||
    ■XMLファイル test.xml
    <div>
    <ul>
    <li>AAの部分</li>
    <li>AAの部分</li>
    <li>CCの部分</li>
    <li>AAの部分</li>
    <li>BBの部分</li>
    </ul>
    </div>
    ||<

  • id:windofjuly
    うぃんど 2011/01/19 16:48:29
    間接回答拒否になってるのでウォッチだけしていたのですが・・・

    unsetは複数ノードに対しての一括処理はできませんので下記のようにします
    foreach($xml->xpath("//li[@id='bought']") AS $elm) {
    unset( $elm[0] );
    }
    どうして[0]がついているのかについてはprint_r($elm) を行うなどで確認してみてくださいな
  • id:la-la-land
    http://www.technotype.net/tutorial/tutorial.php?fileId={PHP}&sectionId={removing-the-element-and-attribute-node}

    ここを見ると、やはり$elm[0] としないと変更できないのかな、と。
  • id:k_gobo
    みなさまアドバイスありがとうございます。
    なかなか試す時間が取れなくて、遅くなってすみません。
    $elm[0]で消えました! 良かった!
    お世話になりました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません