使用DOMXPath

时间:2016-11-15 09:48:51

标签: php xml domxpath

从以下结构:

image shows the div from where to get data

我尝试使用以下代码获取标记的文本:

$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。如何正确获取数字?

2 个答案:

答案 0 :(得分:0)

您的$Website_Xpath看起来像DOMXPath的对象。然后,您的代码的主要问题在于XPath表达式:'div/div[@class="cat_price"]/text()'。您正尝试从无处获取div。是从根节点提供完整路径(例如/html/body/div),还是选择所有带有//前缀的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"

答案 1 :(得分:0)

您应该提供实际代码段,而不仅仅是截图。如果我正确解释了屏幕截图,则代码段如下:

$xml = <<<'XML'
<body>
  <div class="cat_price">
    <div class="was">67,000 - PKR</div>
    "
          64,9999"<span> - PKR</span>
  </div>
</body>
XML;

带有价格的文本节点是具有类was的div的以下兄弟节点。因此可以使用该轴获取它:

$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()可以根据表达式返回标量值。字符串强制转换或字符串函数将返回一个字符串。

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"