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

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

ただいまの
回答率

90.48%

  • PHP

    24449questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,896

SugiuraY

score 208

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

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

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

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

$cArray=array(111,222,333,444,555,666,777,888,999);
$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>';//失礼しました、分かりやすいように修正します
$num=($sampleNode->length);//A,B,Cで3つ
for ($i=0; $i < $num; $i++) { 
  $searchNode=$sampleNode->item($m)->getAttribute('c');
  $resultArray[]=$searchNode;
}
$num2=count($cArray);//9つ
for ($i=0; $i <$num2 ; $i++) { //ループで111,222,333~999がc属性のものをすべて検索
  if ($cArray[$i]==$resultArray[0]) {
    $key=0;
  } elseif($cArray[$i]==$resultArray[1]){
    $key=1;
  }elseif($cArray[$i]==$resultArray[2]){
    $key=2;
}
$fruit[]=$sampleNode->item($key)->getAttribute('b');//111,222,444,555,,777,888はxmlに存在しないためNull 333=>banana 666=>peach 999=>mangoが取得できる
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2017/08/22 14:03

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

    キャンセル

  • SugiuraY

    2017/08/22 18:30

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

    キャンセル

回答 2

+1

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

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

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

<?php
$xml='<body>
<A a="apple" b="banana" c="333"></A>
<A a="orange" b="peach" c="666"></A>
<A a="pinapple" b="mango" c="999"></A>
<A a="hoge" b="piyo" c="333"></A>
</body>
';

$dom = new DOMDocument;

$dom->loadXML($xml);
$xpath = new DOMXPath($dom);

$nodeList = $xpath->query('//A[@c="333"]/@b');
foreach($nodeList as $domAttr){
        var_dump($domAttr->value);
}


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

<?php
 $cArray=array(111,222,333,444,555,666,777,888,999);
 $xml = <<<XML
 <elements>
   <A a="apple" b="banana" c="333">a</A>
   <A a="orange" b="peach" c="666">b</A>
   <A a="pinapple" b="mango" c="999">c</A>
 </elements>
XML;

 $saku = new SimpleXMLElement($xml);
 $num = $saku->count();
 echo $num,"\n";

 foreach ($saku->xpath("A[@c=\"333\" or @c=\"999\"]") as $hera) {
     echo (string)$hera->attributes()->{'b'},"\n";
 }
?>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • PHP

    24449questions

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