3

当我想使用 XPath 打印评估表达式的结果时出现错误。

$url = $xpath->evaluate('//a/@href', $event); 回声 $url ;

我有这个错误:可捕获的致命错误:类 DOMNodeList 的对象无法转换为字符串

我的代码:

<?php
    // Get the HTML Source Code
    $url='http://www.parisbouge.com/events/2012/05/01/';
    $source = file_get_contents($url);

    // DOM document Creation
    $doc = new DOMDocument;
    $doc->loadHTML($source);

    // DOM XPath Creation
    $xpath = new DOMXPath($doc);

    // Get all events
    $events = $xpath->query('//li[@class="nom"]');

    // Count number of events
    printf('There is %d events<br />', $events->length);

    // List all events
    for($i = 0; $i < ($events->length); $i++) {
        $event = $events->item($i);
        $url = $xpath->evaluate('//a/@href', $event);
        $nom = $xpath->evaluate('//a/text()', $event);
        $lieu = $xpath->evaluate('../li[@class="lieu"]/a/text()', $event);
        echo "Result : $url $nom $lieu <br/>";
    }
?>
4

3 回答 3

5

试试这个以获取有关节点的信息。

 // List all events
for($i = 0; $i < ($events->length); $i++) {
    $event = $events->item($i);
    $url = $xpath->evaluate('.//a/@href', $event);
    $nom = $xpath->evaluate('.//a/text()', $event);
    $lieu = $xpath->evaluate('../li[@class="lieu"]/a/text()', $event);

    $result = '';
    if ($url->length > 0) {
        $result .= $url->item(0)->value;
    }

    if ($nom->length > 0) {
        $result .= $nom->item(0)->wholeText;
    }

    if ($lieu->length > 0) {
        $result .= $lieu->item(0)->wholeText;
    }

    echo $result . "<br />";
    //echo "Result : " . $url->item(0)->value . ' | ' . $nom->item(0)->wholeText  . ' | ' . $lieu->item(0)->wholeText . "<br/>";
}

不要忘记添加检查节点是否存在等。要检查是否有任何节点,您可以检查节点列表长度或抑制“戈登”建议的错误。

于 2012-05-01T10:24:58.147 回答
4

引用http://php.net/manual/de/domxpath.evaluate.php

如果可能,返回类型化结果或包含与给定 XPath 表达式匹配的所有节点的 DOMNodeList。

所以您的 XPath 显然会返回多个节点,这可能源于您使用//的意思是“到处查找”。如果你这样做echo $url->length;,你会看到有 460 个项目(无论传递的上下文节点如何)。

来自http://www.w3.org/TR/xpath/#path-abbrev

  • //para选择文档根的所有 para 后代,因此选择同一文档中的所有 para 元素作为上下文节点
  • .//para选择上下文节点的 para 元素后代

所以你需要.//a/@href改用。这将只给出 1 个结果,echo $url->length;但它不能作为类型化结果返回,因此您必须将代码更改为

$url = $xpath->evaluate('string(.//a/@href)', $event);
$nom = $xpath->evaluate('string(.//a)', $event);
$lieu = $xpath->evaluate('string(../li[@class="lieu"]/a)', $event);

另请注意,您可以将DOMDocument创建和加载时间缩短到

libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->loadHTMLFile('http://www.parisbouge.com/events/2012/05/01/');

调用libxml_use_internal_errors将抑制任何解析错误。

于 2012-05-01T10:13:16.093 回答
0

尝试

$url = $xpath->evaluate('string(.//a/@href)', $event); echo $url ;

这将为您提供包含在href其中的第一个字符串,而不是节点a$event

于 2012-05-01T15:10:31.433 回答