簡體   English   中英

XmlDocument - xpath 不返回任何內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM