PHP SimpleXML を学習していますが、いくつか質問があります。仕事のイントラネットで Web からコードを取得するために遊んでいます。コードはいつでも変更される可能性があるため、可能な限り汎用コードが必要です。この例では、div タグとそのすべての子を選択します。
... <div class="cabTabs"> <ul> <li><a href="/link1">Info1</a></li> <li><a href="/link2">Info2</a></li> <li><a href="/link3">Info3</a></li> </ul> </div> ... //Get all web content: $b = new sfWebBrowser(); //using symfony 1.4.17 sfWebBrower to get a SimpleXML object. $b->get('http://intranetwebexample'); //returns a sfWebBrower object. $xml = $b->getResponseXML(); //returns a SimpleXMLElement //[Eclipse xdebug Watch - $xml] "$xml" SimpleXMLElement @attributes Array [3] head SimpleXMLElement body SimpleXMLElement //Get the div class="cabTabs". $result = $xml->xpath('//descendant::div[@class="cabTabs"]'); //[Eclipse xdebug Watch - $result] "$result" Array [1] 0 SimpleXMLElement @attributes Array [1] class cabTabs ul SimpleXMLElement li Array [6]
質問:
- 子孫の使用:: 接頭辞:
他のスタックオーバーフローのトピックで、子孫:: 接頭辞が推奨されないことを読みました。タグとそのすべてのコンテンツを選択するには、どうすればよいですか? 上記のコードを使用していますが、それが正しい方法であるかどうかはわかりません。 - Eclipse xdebug 変数をチェックするいくつかの質問 ウォッチ:
2.1 時々、SimpleXML ツリーを 1 つまたは複数のレベル以上展開できないことがあります。上記の例では、以下の「li」ノードにアクセス/表示できず、その子が表示されません。
SimpleXML オブジェクトを使用した xdebug デバッガーの制限でしょうか、それとも Eclipse Watch の制限でしょうか?
通常のループ foreach($ul->li as $li) で親にアクセスすると、「li」ノードを完全に展開/表示できます。
ただし、重大なバグではありません。直接確認して、適切なフォーラムで報告するのが最適だと思います。
2.2 $xml->xpath の結果コードがまったくわからない:
Eclipse Watch を見ると、"div" タグは 0 インデックス キーに変換されていますが、"ul" と "li" はタグには元の名前がありましたが、なぜですか?
2.3ジェネリックコードでxpathコンテンツにアクセス/ループする方法:
次の非ジェネリックコードを使用してアクセスします:
foreach ($result as $record) { foreach($record->ul as $ul) { foreach($ul->li as $li) { foreach($li->a as $a) { echo ' ' . $a->name; } } } }
上記のコードは機能しますが、正しいタグ名を記述した場合に限られます。(->ul, ->li, ->a..)
毎回子の名前を指定せずにすべてのコンテンツをループする一般的な方法は何ですか? (->ul、->li、->a..)
また、正しい方法でない限り、配列に変換する必要はありません。
私は children() プロパティを試してみましたが、うまくいきません。その行で停止してクラッシュします: foreach ($result->children() as $ul)
私の質問を読んでくれてありがとう。どんな助けも大歓迎です :)
システム情報:
symfony 1.4.17 with sfWebBrowserPlugin, cURL daapter.
cURL サポートが有効になっている PHP 5.4.0、cURL 情報 7.24.0