PHP Xpath, помогите выбрать очень конкретный узел - PullRequest
0 голосов
/ 17 мая 2010

Аналогичный вопрос прошлой ночи, у меня нет доступа к редактированию исходного HTML-кода, и я пытаюсь проанализировать много данных с веб-сайта, чтобы сравнить цены на товары. По большей части это работает, но сейчас я пытаюсь сделать его более эффективным, быстрым и легким для чтения моего спагетти-кода.

У меня есть следующий тестовый код; и что я хочу сделать, это только вернуть атрибут содержимого (например, thisiswhatiwant) , если значение_узла для productType равно Stocked и ничего больше.

<div id="productListing">

<div class="productDetail">
    <span class="productType">Stocked</span>: <span class="productStock"><span class='productContent' content='thisiswhatiwant'></span></span>
</div>

<div class="productDetail">
    <span class="productType">Non-stocked</span>: <span class="productStock"><span class='productContent' content='xyz'></span></span>
</div>

…

<div class="productDetail">
    <span class="productType">Non-stocked</span>: <span class="productStock"><span class='productContent' content='123'></span></span>
</div>

</div>

Это запрос Xpath, который у меня есть до сих пор, но я либо упускаю что-то жизненно важное, либо что-то в моем мозгу просто еще не включилось.

//div[@id="productListing"]/div[@class="productDetail"]/span[@class="productStock"]/preceding-sibling::span[text()="Stocked"]

По сути, я хочу вывести из приведенного выше тестового кода:

<?
echo "Output: " . $dom->getAttribute('content');
?>

Output: thisiswhatiwant

У кого-нибудь есть идеи?

1 Ответ

2 голосов
/ 17 мая 2010

Предполагается, что $dom является объектом DomDocument, созданным из данной строки XML:

$xpath = new DOMXPath($dom);
$q = '//span[@class="productType" and text()="Stocked"]/ancestor::*[@class="productDetail"]/span[@class="productStock"]/span[@class="productContent"]';
$res = $xpath->query($q);
foreach($res as $node) {
    echo $node->getAttribute('content') . PHP_EOL;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...