21

したがって、次のような HTML 文字列があります。

<td class="name">
   <a href="/blah/somename23123">Some Name</a>
</td>
<td class="name">
   <a href="/blah/somename28787">Some Name2</a>
</td>

XPath を使用すると、次の Xpath クエリを使用して href 属性の値を取得できます。

 $domXpath = new \DOMXPath($this->domPage);
 $hrefs = $domXpath->query("//td[@class='name']/a/@href");
 foreach($hrefs as $href) {...}

次のように、テキスト値を取得するのはさらに簡単です。

 // Xpath auto. strips any html tags so we are 
 // left with clean text value of a element
 $domXpath = new \DOMXPath($this->domPage);
 $names = $domXpath->query("//td[@class='name']/");
 foreach($names as $name) {...}

今、知りたいのですが、これら2つのクエリを組み合わせて、1つのクエリだけで両方の値を取得するにはどうすればよいですか (そのようなものであれば可能ですか?)。

4

3 に答える 3

24

フェッチ

//td[@class='name']/a

次に、 でテキストを抜き取り、nodeValueで属性を抜き取りますgetAttribute('href')

それとは別に、Xpathクエリをユニオン演算子と組み合わせることが|できるので、使用できます

//td[@class='name']/a/@href|//td[@class='name']

同じように。

于 2011-07-25T18:19:29.213 に答える
18

コードを 1 つのループに減らすには、次のことを試してください。

$anchors = $domXpath->query("//td[@class='name']/a");
foreach($anchors as $a)
{ 
    print $a->nodeValue." - ".$a->getAttribute("href")."<br/>";
}

上記のとおり:)遅すぎる..

于 2011-07-25T18:22:15.560 に答える
5

最も簡単な方法evaluateは、このタスクです。

値を取得する最も簡単な方法は、evaluate()メソッドによるものです。

$xp = new DOMXPath($dom);
$v = $xp->evaluate("string(/etc[1]/@stringValue)");

注: XPath の戻り値を 1 項目 (aこの場合は最初の項目) に制限し、値をorなどでキャストすることが重要です。string()round()


したがって、複数のアイテムのセットで、foreachコードを使用して、

 $names = $domXpath->query("//td[@class='name']/");
 foreach($names as $contextNode) {
    $text = $domXpath->evaluate("string(./a[1])",$contextNode);
    $href = $domXpath->evaluate("string(./a[1]/@href)",$contextNode);
 }

PS: この例はevaluateの説明のためだけのものです... 情報がノードに既に存在する場合は、最高のパフォーマンスを提供するものを メソッド などとして使用しgetAttribute()によって提供される、などsaveXML()としてプロパティを使用します。この特定の問題については、@Gordon の回答を参照してください。XPath サブクエリ(コンテキストで) は、複雑なケースに適しています。または、コードを単純化し、 hasChildNodes() + $childNodes のループなどをチェックすることを回避しますがパフォーマンス大幅に向上することはありません。$nodeValue$textContentDOMNode

于 2017-07-10T11:22:03.237 に答える