使用 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"