DOMXpath-получить атрибут href и текстовое значение элемента a

Итак, у меня есть строка HTML, как это:

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

используя XPath, я могу получить значение атрибута href, используя этот запрос Xpath:

 $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) {...}

Теперь мне интересно знать, как я могу объединить эти два запроса, чтобы получить оба значения только с одним запросом (если это что-то вроде этого даже возможно?).

3 ответов


Fetch

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

а затем вырвать текст с nodeValue и атрибут с getAttribute('href').

кроме того, вы можете комбинировать запросы Xpath с оператором Union | так что вы можете использовать

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

как хорошо.


чтобы уменьшить код до одного цикла, попробуйте:

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

Как указано выше :) слишком медленно ..


самый простой способ,evaluate для этой задачи!

самый простой способ получить значение с помощью evaluate() метод:

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

Примечание: важно ограничить XPath возвращается к 1 пункту (первый a в данном случае), и cast значение string() или round(), etc.


Итак, в наборе из нескольких элементов, используя ваш 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'ы иллюстрация... Когда информация уже существует на узле, используйте what offers лучшие показатели, как методы getAttribute(), saveXML(), etc. и свойства как $nodeValue, $textContent, etc. предоставленный DOMNode.
см. ответ @Gordon для этой конкретной проблемы.
на подзапрос XPath (в контексте) хороша для сложных случаев - или упрощения кода, не допуская, чтобы проверить hasChildNodes() + петля для $childNodes, etc. без значительного выигрыша в производительности.