2012-05-01 93 views
3

我想在XPath中打印評估表達式的結果時出現錯誤。PHP - DOMXpath - 獲取結果

$ url = $ xpath-> evaluate('// a/@ href',$ event); echo $ 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/>"; 
    } 
?> 
+0

我不能在路徑的正確性說話評估函數調用,但我的經驗與文檔中隱含的內容相反,如果表達式僅導致一個節點,則評估不會返回標量值。但如果表達式導致單個節點,並且您在路徑中使用明確的類型轉換,評估將返回標量。因此,如果它讀取爲$ url = $ xpath-> evaluate('string(// a/@ href)',$ event),那麼您的第一次評估調用將工作(假設路徑僅導致一個節點)。 –

回答

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/>"; 
} 

不要忘記補充檢查是否存在等節點要檢查是否有任何節點上,您可以檢查節點列表lenght或suppres錯誤「戈登」如何建議。

+0

好聽起來更好:) – geekInside

+0

如何檢查節點是否存在? – geekInside

4

報價http://php.net/manual/de/domxpath.evaluate.php

Returns a typed result if possible or a DOMNodeList containing all nodes matching the given XPath expression.

讓你XPath顯然會返回多個節點,這可能源於您使用//這意味着「到處找」。如果你做echo $url->length;你會看到有460個項目(不管傳遞的上下文節點)。

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

  • //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的調用將會抑制任何分析錯誤。

+0

我試過蒙山。// a/@ href仍然是相同的錯誤 – geekInside

0

嘗試用

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

這會給你內$event包含作爲字符串的第一ahref,而不是比一個節點