2010-08-29 37 views
5

test.htmlTôi đang làm gì sai với xpath?

<html> 
    <body> 
     <span> hello Joe</span> 
     <span> hello Bob</span> 
     <span> hello Gundam</span> 
     <span> hello Corn</span> 
    </body> 
</html> 

PHP tập tin

$doc = new DOMDocument(); 
$doc->loadHTMLFile("test.html"); 

$xpath = new DOMXPath($doc); 

$retrieve_data = $xpath->evaluate("//span"); 

echo $retrieve_data->item(1); 
var_dump($retrieve_data->item(1)); 
var_dump($retrieve_data); 

Tôi cố gắng để sử dụng XPath để tìm ra nhịp và sau đó echo nó, nhưng có vẻ như tôi không thể echo nó. Tôi đã cố gắng bán phá giá nó để xem nếu được đánh giá đúng, và tôi không chắc chắn những gì hiện ra này có nghĩa là:

object(DOMElement)#4 (0) { } 
object(DOMNodeList)#7 (0) { } 

#4#7 nghĩa và những gì không ngoặc có ý nghĩa; Cú pháp có ý nghĩa gì?

Cập nhật: Đây là lỗi tôi nhận được khi tôi cố gắng echo $retrieve_data;$retrieve_data->item(1);

Catchable fatal error: Object of class DOMNodeList could not be converted to string 
+0

Không phải là câu trả lời cho câu hỏi của bạn, nhưng có PHP thư viện DOM cho phép truy vấn các đối tượng cách jQuery mà cảm thấy tự nhiên hơn nhiều với tôi hơn XPath. Tôi * ghét * XPath. [PHPQuery] (http://code.google.com/p/phpquery/) sử dụng PHP DOM - các ví dụ [ở đây] (http://phpquery-library.blogspot.com/); [SimpleHTMLDOM] (http://simplehtmldom.sourceforge.net/) là chuỗi dựa nhưng cũng rất đẹp. –

+0

Tôi không biết cú pháp XPath của PHP, nhưng bạn đã thử "// span/text()" chưa? Hiện tại, bạn đang chọn các phần tử, nhưng bạn muốn xuất văn bản bên trong các phần tử. –

+1

@chris_l Nó không phải ** Cú pháp XPath ** của PHP. Nó chỉ là XPath. Tương tự với bất kỳ ngôn ngữ nào khác, chỉ PHP đó mới hỗ trợ XPath 1.0. @ Doug câu hỏi của bạn không liên quan gì đến XPath. Bạn đang hỏi làm thế nào để đọc đầu ra 'var_dump' chuẩn. – Gordon

Trả lời

2

Nếu bạn muốn văn bản đầu ra bên trong khoảng thời gian bạn có thể sử dụng tài sản textContent:

echo $ retrieve_data-> mục (1) -> textContent;

+0

Tôi đã cố gắng echo '$ retrieve_data-> item (1);' trước đó. Có nên không lặp lại html span? Ngoài ra, tôi có thể tìm tài liệu cho phần textContent ở đâu? Tôi không biết bạn có thể làm điều đó. – Strawberry

+0

Cũng giống như VdesmedT nói dưới đây mục (1) không phải là một chuỗi - đó là đối tượng Node mà có thể bao gồm rất nhiều thứ bên cạnh văn bản và tên. Lớp cơ sở cho tất cả các nút được mô tả (với tất cả các thuộc tính có sẵn) ở đây: http://www.php.net/manual/en/class.domnode.php – Shcheklein

1

Nếu bạn muốn đầu ra XML (hoặc HTML thay), hãy thử:

echo $doc->saveXML($retrieve_data->item(1)); 

BTW , DOMNodeList, đó là kết quả của truy vấn của bạn, không được lập chỉ mục cơ sở, vì vậy mục đầu tiên sẽ là 0. Nhưng có lẽ bạn đã biết điều này rồi.

1

mục cho bạn một đối tượng DOMNode, echo sức hữu nodeValue nó giúp

+0

Tôi không biết bạn nói gì. NodeValue của nó là gì? Thích mục (1)? – Strawberry

+0

echo $ retrieve_data-> item (1) -> nodeValue; – VdesmedT

3
$xpath->evaluate("//span"); 

trả về kết quả đánh nếu có thể hoặc một DOMNodeList chứa tất cả các nút phù hợp với biểu thức XPath nhất định. Trong trường hợp của bạn, nó trả về một DOMNodeList, bởi vì XPath của bạn đánh giá thành bốn DOMElements, được chuyên biệt DOMNodes. Hiểu khái niệm Node khi làm việc với bất kỳ XML nào, bất kể ngôn ngữ nào là quan trọng.

echo $retrieve_data->item(1); 

không thể làm việc, bởi vì DOMNodeList::item trả về một DOMNode và đặc biệt hơn một DOMElement trong trường hợp của bạn. Bạn không thể echo các đối tượng thuộc loại nào trong PHP, nếu chúng không thực hiện phương thức __toString(). DOMElement không. Không DOMNodeList. Do đó, bạn nhận được lỗi nghiêm trọng mà đối tượng không thể được chuyển đổi thành chuỗi.

Để nhận giá trị của DOMElement, bạn có thể đọc nodeValue hoặc textContent.

Một số ví dụ DOM của tôi: https://stackoverflow.com/search?q=user%3A208809+dom

Các vấn đề liên quan