2011-01-08 33 views
11

mã của tôi cố gắng lấy dữ liệu từ nguồn cấp dữ liệu RSS của trang web. Nó lấy các nút tốt, nhưng khi cố gắng lấy dữ liệu từ một nút có dấu hai chấm, nó đổ vỡ và đưa ra lỗi "Trình quản lý không gian tên hoặc XsltContext cần thiết. Truy vấn này có tiền tố, biến hoặc hàm do người dùng xác định." Mã được hiển thị bên dưới:Làm thế nào để chọn các nút XML với không gian tên XML từ một XmlDocument?

WebRequest request = WebRequest.Create("http://buypoe.com/external.php?type=RSS2&lastpost=true"); 
WebResponse response = request.GetResponse(); 

StringBuilder sb = new StringBuilder(""); 
System.IO.StreamReader rssStream = new System.IO.StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("utf-8")); 

XmlDocument rssDoc = new XmlDocument(); 
rssDoc.Load(rssStream); 

XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item"); 

for (int i = 0; i < 5; i++) 
{ 
    XmlNode rssDetail; 
    rssDetail = rssItems.Item(i).SelectSingleNode("dc:creator"); 

    if (rssDetail != null) 
    { 
     user = rssDetail.InnerText; 
    } 
    else 
    { 
     user = ""; 
    } 
} 

Tôi hiểu rằng tôi cần xác định không gian tên nhưng không chắc chắn cách thực hiện điều này. Trợ giúp sẽ được đánh giá cao.

Trả lời

19

Bạn phải khai báo tiền tố dc namespace sử dụng một XmlNamespaceManager trước khi bạn có thể sử dụng nó trong các biểu thức XPath:

XmlDocument rssDoc = new XmlDocument(); 
rssDoc.Load(rssStream); 

XmlNamespaceManager nsmgr = new XmlNamespaceManager(rssDoc.NameTable); 
nsmgr.AddNamespace("dc", "http://purl.org/dc/elements/1.1/"); 

XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item"); 
for (int i = 0; i < 5; i++) { 
    XmlNode rssDetail = rssItems[i].SelectSingleNode("dc:creator", nsmgr); 
    if (rssDetail != null) { 
     user = rssDetail.InnerText; 
    } else { 
     user = ""; 
    } 
} 
+0

+1 đánh tôi với nó - đó là chính xác đúng, đó là ** không gian tên XML ** - không * Các thẻ XML có dấu hai chấm trong tên * mà chúng ta đang xử lý ở đây ... –

+0

Làm việc hoàn hảo. Đã nghe nói về lệnh AddNamespace nhưng gặp khó khăn trong việc tìm ra tham số thứ hai. – Sticky

+0

@marc_s, đã điều chỉnh tiêu đề. – Sticky

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