Как исключить класс в родительском классе Xpath? PHP - PullRequest
0 голосов
/ 27 октября 2018

Подводя меня к стене, это так, DOM

<div class="product-intro"><p class="product-desc"><span class="product-model">234</span>Product Description</p></div>

Это не что-то вроде этого ... неверный аргумент, не найдены узлы:

$node3 = $xp->query("//p[@class='product-desc and not(@class='product-model']");
$node3 = $xp->query("//p[@class='product-desc'][not([@class='product-model'])]");

Только это:

$node3 = $xp->query("//p[@class='product-desc']");

Работает на отлично и отлично - до получения результата.Вывод:

234. Описание продукта

Я знаю, что могу просто заменить строку, но не в идеале. Как мне получить исключение класса product-modelв моем запросе?

Весь скрипт:

$x = '<div class="product-item productContainer" data-itemno="234">
    <div class="product-and-intro">
        <div class="product">
            <a href="/en/234.html" title="Product Description"> 
                <img src="/ProductImages/106/234.jpg" alt="Product Description" class="itemImage" />
                <div class="product-intro">
                    <p class="product-desc"><span class="product-model">234</span>Product Description</p>
                    <p class="price"><span class="us">US$</span>6.50 <span class="oldprice"><s>$ 13.00</s></span></p>
                </div>
            </a>
        </div>
    </div>
</div>';



$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($x);
$xp = new DOMXPath($dom);
$node1 = $xp->query("//div[@class='product']//img");
$node2 = $xp->query("//span[@class='product-model']");
$node3 = $xp->query("//p[@class='product-desc']");
// $node3 = $xp->query("//p[@class='product-desc']/text()[2]");
// $node3 = $xp->query("//p[@class='product-desc' and not(span/@class='product-model')]");
$node4 = $xp->query("//p[@class='price']");

foreach ($node1 as $n) {
    echo $n->getAttribute('src');
    echo '<br>';
}

foreach ($node2 as $n2) {
    echo $n2->nodeValue;
        echo '<br>';
}

foreach ($node3 as $n3) {
    echo $n3->nodeValue;
        echo '<br>';
}

foreach ($node4 as $n4) {
    echo $n4->nodeValue;
        echo '<br>';
}

1 Ответ

0 голосов
/ 27 октября 2018

Если вы хотите выбрать все элементы p со значением атрибута @class product-desc, а затем отфильтровать тех, у кого есть субэлемент span со значением атрибута @class product-model, вы можете используйте это выражение XPath:

//p[@class='product-desc' and not(span/@class='product-model')]

или в целом

$node3 = $xp->query("//p[@class='product-desc' and not(span/@class='product-model')]");
...