C# 使用多个NS读取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提要以获取最后一次发布日期。我的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/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为空。