2009-02-01 24 views
6

Tôi đang cố gắng phân tích cú pháp nguồn cấp dữ liệu Atom theo chương trình. Tôi có XML nguyên tử được tải xuống dưới dạng chuỗi. Tôi có thể tải XML vào một số XmlDocument. Tuy nhiên, tôi không thể duyệt qua tài liệu bằng XPath. Bất cứ khi nào tôi thử, tôi nhận được null.Không có nút nào được chọn từ tài liệu XML Atom bằng XPath?

Tôi đã sử dụng thức ăn chăn nuôi Atom này như một thử nghiệm: http://steve-yegge.blogspot.com/feeds/posts/default

Calling SelectSingleNode() luôn trả null, trừ khi tôi sử dụng "/". Dưới đây là những gì tôi đang cố gắng ngay bây giờ:

using (WebClient wc = new WebClient()) 
{ 
    string xml = wc.DownloadString("http://steve-yegge.blogspot.com/feeds/posts/default"); 
    XmlNamespaceManager nsMngr = new XmlNamespaceManager(new NameTable()); 
    nsMngr.AddNamespace(string.Empty, "http://www.w3.org/2005/Atom"); 
    nsMngr.AddNamespace("app", "http://purl.org/atom/app#"); 
    XmlDocument atom = new XmlDocument(); 
    atom.LoadXml(xml); 
    XmlNode node = atom.SelectSingleNode("//entry/link/app:edited", nsMngr); 
} 

tôi nghĩ rằng nó có thể đã được vì XPath của tôi, vì vậy tôi cũng đã thử một truy vấn đơn giản của nút gốc kể từ khi tôi biết gốc nên làm việc:

// I've tried both with & without the nsMngr declared above 
XmlNode node = atom.SelectSingleNode("/feed"); 

Không có vấn đề gì tôi làm, có vẻ như nó không thể chọn bất cứ điều gì. Rõ ràng là tôi đang thiếu một cái gì đó, tôi chỉ không thể tìm ra cái gì. Tôi cần phải làm gì để làm cho XPath hoạt động trên nguồn cấp dữ liệu Atom này?

EDIT

Mặc dù câu hỏi này có một câu trả lời, tôi phát hiện ra câu hỏi này có gần như chính xác lặp lại: SelectNodes not working on stackoverflow feed

+0

thể trùng lặp của [SelectNodes không làm việc trên thức ăn stackoverflow] (http://stackoverflow.com/questions/24734/selectnodes-not-working-on-stackoverflow-feed) –

Trả lời

8

Trong khi C# thực hiện có thể cho phép không gian tên mặc định (Tôi không biết), thông số XPath 1.0 không. Vì vậy, cung cấp cho "Atom" tiền tố riêng của mình:

nsMngr.AddNamespace("atom", "http://www.w3.org/2005/Atom"); 

Và thay đổi XPath của bạn một cách thích hợp:

XmlNode node = atom.SelectSingleNode("//atom:entry/atom:link/app:edited", nsMngr); 
0

tải XML từ một chuỗi và tra cứu đối với bất kỳ 'lỗi/Lỗi' nút.

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xmlResult);    
XmlNamespaceManager nm = new XmlNamespaceManager(xmlDoc.NameTable); 
nm.AddNamespace("ns", "http://somedomain.com/namespace1/2"); //ns - any name, make sure it is same in the below line 

XmlNodeList errors = xmlDoc.SelectNodes("/ns:*//ns:Errors/ns:Error", nm);  

-Mathulan

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