使用 DOMXPath 获取特定文本节点的值
Fetching value of specific text node using DOMXPath
来自以下结构:
我正在尝试使用以下代码获取标记的文本:
$price_new='div/div[@class="cat_price"]/text()';
if ($price_new!=null && $node = $Website_Xpath->query ($price_new, $row )) {
$result [$value] ['Price'] = $node->item( 0 )->nodeValue;
} else {
$result [$value] ['Price'] = "";
}
但节点值为NULL
。如何正确获取号码?
您的 $Website_Xpath
看起来像 DOMXPath
的对象。那么您的代码的主要问题出在 XPath 表达式中:'div/div[@class="cat_price"]/text()'
。您正试图从无处获取 div
。是否提供从根节点开始的完整路径(例如 /html/body/div
),或 select 所有带有 //
前缀的 div。
例子
$xml = <<<'XML'
<body>
<div class="cat_price">
<div class="was">67,000 - PKR</div>
64,9999<span> - PKR</span>
</div>
</body>
XML;
$doc = new DOMDocument();
$doc->loadXML($xml);
$text = '';
$xpath = new DOMXPath($doc);
// Select all text nodes within a <div> having class="cat_price"
if ($nodes = $xpath->query('//div[@class="cat_price"]/text()')) {
// Search for a node with some content, except spaces
foreach ($nodes as $n) {
if ($text = trim($n->nodeValue))
break;
}
}
var_dump($text);
输出
string(7) "64,9999"
您应该提供实际的片段,而不仅仅是它的屏幕截图。如果我正确地解释了屏幕截图,则该片段类似于:
$xml = <<<'XML'
<body>
<div class="cat_price">
<div class="was">67,000 - PKR</div>
"
64,9999"<span> - PKR</span>
</div>
</body>
XML;
带有价格的文本节点是 div 和 class was
的下一个兄弟节点。因此可以使用该轴获取它:
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$expression = 'string(//div[@class="cat_price"]
/div[@class="was"]/following-sibling::text()[1])';
var_dump($xpath->evaluate($expression));
与 DOMXpath::query()
不同,DOMXpath::evaluate()
可以 return 标量值,具体取决于表达式。字符串转换或字符串函数将 return 一个字符串。
string(25) "
"
64,9999""
然而,结果将不仅包含数字,还包含引号和一些空格。 translate()
和 normalize-space()
可用于清理它:
$expression = 'normalize-space(
translate(//div[@class="cat_price"]
/div[@class="was"]/following-sibling::text()[1], \'"\', " ")
)';
var_dump($xpath->evaluate($expression));
输出:
string(7) "64,9999"
来自以下结构:
我正在尝试使用以下代码获取标记的文本:
$price_new='div/div[@class="cat_price"]/text()';
if ($price_new!=null && $node = $Website_Xpath->query ($price_new, $row )) {
$result [$value] ['Price'] = $node->item( 0 )->nodeValue;
} else {
$result [$value] ['Price'] = "";
}
但节点值为NULL
。如何正确获取号码?
您的 $Website_Xpath
看起来像 DOMXPath
的对象。那么您的代码的主要问题出在 XPath 表达式中:'div/div[@class="cat_price"]/text()'
。您正试图从无处获取 div
。是否提供从根节点开始的完整路径(例如 /html/body/div
),或 select 所有带有 //
前缀的 div。
例子
$xml = <<<'XML'
<body>
<div class="cat_price">
<div class="was">67,000 - PKR</div>
64,9999<span> - PKR</span>
</div>
</body>
XML;
$doc = new DOMDocument();
$doc->loadXML($xml);
$text = '';
$xpath = new DOMXPath($doc);
// Select all text nodes within a <div> having class="cat_price"
if ($nodes = $xpath->query('//div[@class="cat_price"]/text()')) {
// Search for a node with some content, except spaces
foreach ($nodes as $n) {
if ($text = trim($n->nodeValue))
break;
}
}
var_dump($text);
输出
string(7) "64,9999"
您应该提供实际的片段,而不仅仅是它的屏幕截图。如果我正确地解释了屏幕截图,则该片段类似于:
$xml = <<<'XML'
<body>
<div class="cat_price">
<div class="was">67,000 - PKR</div>
"
64,9999"<span> - PKR</span>
</div>
</body>
XML;
带有价格的文本节点是 div 和 class was
的下一个兄弟节点。因此可以使用该轴获取它:
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$expression = 'string(//div[@class="cat_price"]
/div[@class="was"]/following-sibling::text()[1])';
var_dump($xpath->evaluate($expression));
与 DOMXpath::query()
不同,DOMXpath::evaluate()
可以 return 标量值,具体取决于表达式。字符串转换或字符串函数将 return 一个字符串。
string(25) "
"
64,9999""
然而,结果将不仅包含数字,还包含引号和一些空格。 translate()
和 normalize-space()
可用于清理它:
$expression = 'normalize-space(
translate(//div[@class="cat_price"]
/div[@class="was"]/following-sibling::text()[1], \'"\', " ")
)';
var_dump($xpath->evaluate($expression));
输出:
string(7) "64,9999"