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

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

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

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

Q&A

解決済

2回答

1081閲覧

PHPのDOM操作(特定の属性を検索し、同一タグの他の属性を取得した)について

SugiuraY

総合スコア317

PHP

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

0グッド

0クリップ

投稿2017/08/22 04:56

編集2017/08/22 09:29

PHPのマニュアルでも目的を達成するためのコードが思いつかなかったため、
ご質問させてください。

結論を申し上げますと

  1. c属性が333を満たすタグについて
  2. b属性の値("222")を取得したい

が目的になります。
すべてgetElementByIdでノードを指定してから、getAttributeでcを配列に入れて
すべての要素が"333"に一致するかを検索する方法は思いつくのですが、検索したいc属性の値も
検索対象のノードも大量にあるため、これをすべてループで処理させることはあまり賢しい方法とは
思えないのですが、何か良い方法があればアドバイスを頂ければ幸いです。
宜しくお願い申し上げます。

XML

1<A a="111" b="222" c="333"></A> 2<B a="444" b="555" c="666"></A>

(加筆)
うまくご説明できるかわかりませんが、申し少し分かりやすい例でコードを記載させて頂きます。

PHP

1$cArray=array(111,222,333,444,555,666,777,888,999); 2$xml='<A a="apple" b="banana" c="333"></A> <A a="orange" b="peach" c="666"></A> <A a="pinapple" b="mango" c="999"></A>';//失礼しました、分かりやすいように修正します 3$num=($sampleNode->length);//A,B,Cで3つ 4for ($i=0; $i < $num; $i++) { 5 $searchNode=$sampleNode->item($m)->getAttribute('c'); 6 $resultArray[]=$searchNode; 7} 8$num2=count($cArray);//9つ 9for ($i=0; $i <$num2 ; $i++) { //ループで111,222,333~999がc属性のものをすべて検索 10 if ($cArray[$i]==$resultArray[0]) { 11 $key=0; 12 } elseif($cArray[$i]==$resultArray[1]){ 13 $key=1; 14 }elseif($cArray[$i]==$resultArray[2]){ 15 $key=2; 16} 17$fruit[]=$sampleNode->item($key)->getAttribute('b');//111,222,444,555,,777,888はxmlに存在しないためNull 333=>banana 666=>peach 999=>mangoが取得できる 18}

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

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

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

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

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

m.ts10806

2017/08/22 05:03

現在書かれているPHPのコードはありますでしょうか?
SugiuraY

2017/08/22 09:30

コードを記載させていただきました。
guest

回答2

0

DOM操作は殆どやったことが無いので
DOMDocument 要素 検索 php

で検索して、たどり着いた

mpywさんの
PHPネイティブのDOMによるスクレイピング入門
を参考にしたところ、XPath式で検索するのが楽そうな感じなのでやってみました。
随時PHPマニュアルの該当クラスページも参照しながら

多分、以下の様な内容でいけるんじゃないでしょうか。

PHP

1<?php 2$xml='<body> 3<A a="apple" b="banana" c="333"></A> 4<A a="orange" b="peach" c="666"></A> 5<A a="pinapple" b="mango" c="999"></A> 6<A a="hoge" b="piyo" c="333"></A> 7</body> 8'; 9 10$dom = new DOMDocument; 11 12$dom->loadXML($xml); 13$xpath = new DOMXPath($dom); 14 15$nodeList = $xpath->query('//A[@c="333"]/@b'); 16foreach($nodeList as $domAttr){ 17 var_dump($domAttr->value); 18}

実行結果
string(6) "banana"
string(4) "piyo"

投稿2017/08/22 16:49

tanat

総合スコア18709

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

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

0

ベストアンサー

SimpleXMLElement扱いとして、XPathでc属性を絞り込んだエレメンツにします。
デバッグ済みのサンプルは、or 指定してみました。
ノードの深さや属性の指定の記述方法が独特ですので、PHPのDOM操作のサイトや
本を勉強してみましょう。

php

1<?php 2 $cArray=array(111,222,333,444,555,666,777,888,999); 3 $xml = <<<XML 4 <elements> 5 <A a="apple" b="banana" c="333">a</A> 6 <A a="orange" b="peach" c="666">b</A> 7 <A a="pinapple" b="mango" c="999">c</A> 8 </elements> 9XML; 10 11 $saku = new SimpleXMLElement($xml); 12 $num = $saku->count(); 13 echo $num,"\n"; 14 15 foreach ($saku->xpath("A[@c=\"333\" or @c=\"999\"]") as $hera) { 16 echo (string)$hera->attributes()->{'b'},"\n"; 17 } 18?>

投稿2017/08/22 18:16

seastar3

総合スコア2285

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問