Bạn có nhiều câu hỏi. Tôi sẽ cố gắng để giải quyết từng cái một:
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/');
Từ những gì tôi hiểu chúng hoạt động giống như định nghĩa tài liệu, và được yêu cầu phải xác định các yếu tố XML nhất định.
Có, bất cứ khi nào bạn có tài liệu XML với không gian tên, thì mỗi phần tử có thể nằm trong không gian tên riêng của nó.
Nếu bạn muốn truy cập các phần tử trong vùng tên riêng của chúng, thì có, bạn cần không gian tên để nhận dạng chúng. Ví dụ. trong biểu thức Xpath.
Trong PHP không gian tên XML được hỗ trợ bởi DOMDocument và các phần mở rộng XML dựa trên libxml khác.
PHP thực sự có yêu cầu URL đó và xác minh xem phần tử có tồn tại trong định nghĩa tài liệu không?
Không, vì các mã ví dụ bạn đưa ra:
$xpath->registerNamespace('slash', 'http://purl.org/rss/1.0/modules/slash/');
PHP sẽ không yêu cầu URL đó. Bạn đã nhận thấy rằng URL trống/cung cấp 404 để bạn có thể muốn hiểu điều này là gì. URL đó trên thực tế là một URI. Đó là sự khác biệt và Mã định danh và Định vị.
Để có không gian tên XML làm việc, không có gì cần phải được bố trí. Không gian tên chỉ cần được xác định. Do đó, một không gian tên XML hợp lệ có thể được biểu diễn bằng bất kỳ URI nào. Ví dụ, fantasy:space
là một URI hợp lệ và hoàn toàn đủ điều kiện các yêu cầu để chỉ định một không gian tên XML. Nhưng khi bạn nhập nó vào trình duyệt, bạn thậm chí sẽ không nhận được bất kỳ phản hồi nào của máy chủ (trình duyệt của bạn không biết "tưởng tượng" là gì).
Vì vậy, 404 bạn nhận được không phải là lý do tại sao các dấu gạch chéo là trống với đánh giá XPath của bạn:
$result = $xpath->evaluate('string(//atom:entry[3]/slash:comments)');
Lý do tại sao bạn nhận được một chuỗi rỗng đây là một trong những khác nhau. Xem biểu thức Xpath:
string(//atom:entry[3]/slash:comments)
Đó là yêu cầu giá trị chuỗi của tập hợp nút. Bạn đã xác định các nút thiết lập như:
//atom:entry[3]/slash:comments
Getting a string of a nodeset trong PHP DOMDocument có nghĩa là:
Một nút-bộ được chuyển thành một chuỗi bằng cách trả lại string-value of the node trong nút-bộ đó là lần đầu tiên trong thứ tự tài liệu. Nếu tập hợp nút trống, một chuỗi rỗng sẽ được trả về.
Khi nút là một yếu tố, chuỗi giá trị của the element node có nghĩa là:
Chuỗi giá trị của một nút phần tử là nối của chuỗi giá trị của tất cả các hậu duệ nút văn bản của nút phần tử trong thứ tự tài liệu.
Vì vậy, có hai cách giải thích tại sao bạn nhận được chuỗi rỗng: Tập hợp nút trống hoặc giá trị chuỗi thành phần chỉ là một chuỗi rỗng.
Bạn có thể nhanh chóng tìm hiểu về số lượng các nút bên trong một nút thiết lập bằng cách sử dụng các count()
function:
$result = $xpath->evaluate('count(//atom:entry[3]/slash:comments)');
Mà sau đó sẽ cho bạn một ý tưởng tốt hơn nào trong hai trường hợp là như vậy. Vì bạn chưa chia sẻ XML nguồn nên không thể nói được lý do tại sao đặc biệt là nó - như tôi sẽ giả định - không chứa nút nào. Nhìn thấy nguồn nên làm rõ điều này một cách dễ dàng.
Cho đến lúc đó, tôi chỉ có thể đoán rằng bạn có thể phân tích cú pháp nguồn cấp dữ liệu RSS 2 không chứa các yếu tố <atom:entry>
nhưng chỉ <item>
yếu tố. Xem ví dụ của tôi:
$feed = 'http://hakre.wordpress.com/feed/';
$doc = new DOMDocument();
$doc->load($feed);
$xpath = new DOMXPath($doc);
echo $xpath->evaluate('string(//item[3]/slash:comments)'); # 1
Nó xuất ra giá trị "1" làm số nhận xét cho mục thứ ba. Đây là nguồn cấp dữ liệu của một blog Wordpress chuẩn. I have put this online as an interactive example, so you can see it in action and enter your feed URL.
BTW: Nếu bạn tạo các đối tượng DOMXPath
sau bạn đã nạp XML, bạn không cần phải đăng ký tên miền không gian-URI miễn là bạn biết được các tiền tố được sử dụng trong tài liệu. Đây là lý do tại sao trong ví dụ này tôi không đăng ký bất kỳ không gian tên-URI nào.
nó trả về một DOMNodeList trống ... –