C# 使用多个NS读取XML文件
我正在尝试读取XML提要以获取最后一次发布日期。我的xml如下所示:C# 使用多个NS读取XML文件,c#,xml,C#,Xml,我正在尝试读取XML提要以获取最后一次发布日期。我的xml如下所示: <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/e
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
<channel>
<title>mysite</title>
<atom:link href="http://www.mysite.com/news/feed/" rel="self" type="application/rss+xml" />
<link>http://www.mysite.com/news</link>
<description>mysite</description>
<lastBuildDate>Tue, 22 Nov 2011 16:10:27 +0000</lastBuildDate>
<language>en</language>
<sy:updatePeriod>hourly</sy:updatePeriod>
<sy:updateFrequency>1</sy:updateFrequency>
<generator>http://wordpress.org/?v=3.0.4</generator>
<item>
<title>My first post!</title>
<link>http://www.mysite.com/news/2011/11/22/docstore-v2-released/</link>
<comments>http://www.mysite.com/news/2011/11/22/docstore-v2-released/#comments</comments>
<pubDate>Tue, 22 Nov 2011 16:10:27 +0000</pubDate>
<dc:creator>mysite</dc:creator>
<category><![CDATA[News]]></category>
<category><![CDATA[Promotions]]></category>
<category><![CDATA[docstore]]></category>
private void button1_Click(object sender, EventArgs e)
{
var XmlDoc = new XmlDocument();
// setup the XML namespace manager
var mgr = new XmlNamespaceManager(XmlDoc.NameTable);
// add the relevant namespaces to the XML namespace manager
mgr.AddNamespace("ns", "http://purl.org/rss/1.0/modules/content/");
var webClient = new WebClient();
var stream = new MemoryStream(webClient.DownloadData("http://www.mysite.com/news/feed/"));
XmlDoc.Load(stream);
// **USE** the XML anemspace in your XPath !!
XmlElement NodePath = (XmlElement)XmlDoc.SelectSingleNode("/ns:Response");
while (NodePath != null)
{
foreach (XmlNode Xml_Node in NodePath)
{
Console.WriteLine(Xml_Node.Name + ": " + Xml_Node.InnerText);
}
}
}
我有一个问题,它告诉我:
需要命名空间管理器或XsltContext。此查询具有前缀,
变量,或用户定义的函数
我只想从这段xml代码中提取“lastBuildDate”。我在兜圈子,想把代码弄对
有人能告诉我我做错了什么吗
谢谢大家! 您没有使用命名空间管理器
// **USE** the XML anemspace in your XPath !!
XmlElement NodePath = (XmlElement)XmlDoc.SelectSingleNode("/ns:Response", mgr);
您没有使用命名空间管理器
// **USE** the XML anemspace in your XPath !!
XmlElement NodePath = (XmlElement)XmlDoc.SelectSingleNode("/ns:Response", mgr);
您要查找的元素只有一个,可以使用XPath直接访问它。该元素也位于默认名称空间中,因此无需执行任何特殊操作即可访问它。那么:
var XPATH_BUILD_DATE="/rss/channel/lastBuildDate";
private void button1_Click(object sender, EventArgs e){
var xmlDoc = new XmlDocument();
var webClient = new WebClient();
var stream = new MemoryStream(webClient.DownloadData("http://www.mysite.com/news/feed/"));
xmlDoc.Load(stream);
XmlElement xmlNode = (XmlElement)xmlDoc.SelectSingleNode(XPATH_BUILD_DATE);
Console.WriteLine(xmlNode.Name + ": " + xmlNode.InnerText);
}
但是,如果确实需要深入研究不同名称空间中的元素,也可以使用XPath(例如,获取dc:creator:
/rss/channel/item[1]/*[local-name() = 'creator']
您要查找的元素只有一个,您可以使用XPath直接访问该元素。该元素也位于默认命名空间中,因此无需执行任何特殊操作即可访问该元素。那么:
var XPATH_BUILD_DATE="/rss/channel/lastBuildDate";
private void button1_Click(object sender, EventArgs e){
var xmlDoc = new XmlDocument();
var webClient = new WebClient();
var stream = new MemoryStream(webClient.DownloadData("http://www.mysite.com/news/feed/"));
xmlDoc.Load(stream);
XmlElement xmlNode = (XmlElement)xmlDoc.SelectSingleNode(XPATH_BUILD_DATE);
Console.WriteLine(xmlNode.Name + ": " + xmlNode.InnerText);
}
但是,如果确实需要深入研究不同名称空间中的元素,也可以使用XPath(例如,获取dc:creator:
/rss/channel/item[1]/*[local-name() = 'creator']
你为什么使用XmlDocument/XmlElement而不是更现代的?我不明白。在你展示的XML代码中没有
响应
节点。那么你到底在寻找什么?或者是在你没有展示的部分?你为什么使用XmlDocument/XmlElement而不是更现代的?我不明白。有在您显示的XML代码中没有Response
节点。那么,您到底在寻找什么?或者是在您没有显示的部分中?您是对的,我忽略了这一点。我确实通过了该错误,但NodePath为空。您是对的,我忽略了这一点。我确实通过了该错误,但NodePath为空。