【问题标题】:How to Exclude Class in Parent Xpath Class? PHP如何排除父 Xpath 类中的类? PHP
【发布时间】:2019-04-01 05:06:37
【问题描述】:

把我逼上墙,就像这样,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>';
}

【问题讨论】:

    标签: php dom xpath domdocument


    【解决方案1】:

    如果要选择所有@class 属性值为product-descp 元素,然后过滤掉那些具有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')]");
    

    【讨论】:

    • 是的,我尝试过,就像我想的那样。复制并粘贴了您的完整代码,并做了第一个.. 不工作,没有结果
    • 是的。没有结果就是正确的结果。此表达式不选择 p 元素,因为谓词的计算结果为 FALSE。这就是 XPath 的工作方式。
    • 如果您想获取Product Description 字符串,请使用//p[@class='product-desc']/text()[2] 作为XPath 表达式。
    • 所以没有办法只返回 product-desc 类而不引入 product-model 类?
    • 不幸的是,我预料到了这个问题,因为答案是否定的。 XPath 只是选择 节点。所以内容是完全不同的方面。您可以选择一个节点 - 包括所有子节点 - 但您不必获取其所有内容。
    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多