Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何排除父Xpath类中的类?PHP_Php_Dom_Xpath_Domdocument - Fatal编程技术网

如何排除父Xpath类中的类?PHP

如何排除父Xpath类中的类?PHP,php,dom,xpath,domdocument,Php,Dom,Xpath,Domdocument,把我逼到墙头,就像这样,大教堂 <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']"); 工作得很好很好-就得到结果而言。

把我逼到墙头,就像这样,大教堂

<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']");
工作得很好很好-就得到结果而言。 输出是

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>';
}
如果要选择@class属性值为product desc的所有p元素,然后过滤掉那些具有@class属性值product model的span子元素,则可以使用以下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的工作方式。例如,如果您想要获取产品描述字符串,请使用//p[@class='Product-desc']/text[2]作为XPath表达式。因此,如果不同时引入产品模型类,就无法仅返回产品描述类?不幸的是,我预料到了这个问题,因为答案是否定的。XPath只选择节点。因此,内容是一个完全不同的方面。您可以选择包含所有子节点的节点,但不必获取其所有内容。
$node3 = $xp->query("//p[@class='product-desc' and not(span/@class='product-model')]");