[英]XmlDocument - xpath returns nothing
我正在嘗試閱讀這個science.org 提要: https://www.science.org/rss/news_current.xml
用這個簡單的代碼:
using var httpClient = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, url);
var response = httpClient.Send(request);
var content = await response.Content.ReadAsStringAsync();
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(content);
var items = xmlDoc.DocumentElement?.SelectNodes("//item");
if (items != null)
{
Console.WriteLine($"{url}: items={items.Count}");
}
但我得到 0 個項目...(“內容”變量很好,包含正確的 xml 數據)
它適用於其他 RSS 提要。
知道我做錯了什么嗎?
請注意,根元素包含此默認命名空間聲明: xmlns="http://purl.org/rss/1.0/"
,這意味着文檔中的元素名稱由該命名空間 URI 限定,除非它們具有顯式命名空間前綴。 您的item
元素沒有前綴,這意味着它們確實屬於該 RSS 命名空間。
因此,您需要在查詢中包含命名空間前綴,而不是查詢名為item
的元素,例如//rss:item
,當然要讓該前綴對 SelectNodes 方法有意義,您需要綁定命名空間 URI http://purl.org/rss/1.0/
的rss
前綴。 有關如何處理命名空間的信息,請參閱SelectNodes的文檔。
您也可以使用 XPath 2 並執行例如
using System.Xml;
using Wmhelp.XPath2;
var doc = new XmlDocument(new NameTable());
doc.Load(@"https://www.science.org/rss/news_current.xml");
var xmlNamespaceMgr = new XmlNamespaceManager(doc.NameTable);
xmlNamespaceMgr.AddNamespace("", "http://purl.org/rss/1.0/");
var items = doc.XPath2SelectNodes("//item", xmlNamespaceMgr);
Console.WriteLine(items.Count);
通過使用 NuGet package https://www.Z0558440846982B27F23Borg/packages.X3 .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.