C# 从xml文档c获取单个节点#

C# 从xml文档c获取单个节点#,c#,xml,C#,Xml,我正在尝试从此文档中获取通道元素 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://pu

我正在尝试从此文档中获取通道元素

<rdf:RDF 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns="http://purl.org/rss/1.0/" 
xmlns:slash="http://purl.org/rss/1.0/modules/slash/" 
xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" 
xmlns:admin="http://webns.net/mvcb/" 
xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

    <channel rdf:about="http://developers.slashdot.org/">
     <title>Slashdot: Developers</title>
     <link>http://developers.slashdot.org/</link>
     ...
我不工作。XmlNode通道保持为空。

只需执行以下操作:

XmlNode channel = rssDoc.SelectSingleNode(@"//channel");
这将获得通道节点,然后可以引用、属性、值、InnerXML、FirstChild等从该节点提取数据


*编辑:应该是XmlElement而不是Node

您不能将其添加为空

要与关联的前缀 正在添加的命名空间。使用 String.Empty以添加默认值 命名空间。请注意 XmlNamespaceManager将用于 解析XML路径中的名称空间 语言(XPath)表达式,前缀 必须指定。如果是XPath 表达式不包含前缀, 假定名称空间 统一资源标识符(URI)为 空名称空间。更多 有关XPath表达式的信息 以及XmlNamespaceManager,请参阅 XmlNode.SelectNodes和 XPathExpression.SetContext方法.XPathExpression.SetContext方法

因此,只需将默认前缀添加为“default”,然后使用“/*/default:channel”

工作代码:

        var nsmsgr = new XmlNamespaceManager(rssDoc.NameTable);
        nsmsgr.AddNamespace("default", "http://purl.org/rss/1.0/");

        var root = rssDoc.DocumentElement;
        var channel = rssDoc.SelectSingleNode("/*/default:channel", nsmsgr);
上面的代码可以工作,但是它有一个硬编码的URI,并且它使用一个“欺骗”来避免处理根节点。这里有一个更干净、更通用的解决方案:

        var nsmsgr = new XmlNamespaceManager(rssDoc.NameTable);
        var root = rssDoc.DocumentElement;
        nsmsgr.AddNamespace("default", root.GetAttribute("xmlns"));
        nsmsgr.AddNamespace("rdf", root.GetAttribute("xmlns:rdf"));
        var channel = rssDoc.SelectSingleNode("/rdf:RDF/default:channel", nsmsgr);

您确定您的XPath是正确的吗?我认为在指定子节点之前,您应该先为根节点指定“*”。@marc\u s:是的,但如果他使用“*”接受任何根节点,则不会这样做。@marc\u s:这是可选的“rdf”前缀。看看我的答案。
        var nsmsgr = new XmlNamespaceManager(rssDoc.NameTable);
        nsmsgr.AddNamespace("default", "http://purl.org/rss/1.0/");

        var root = rssDoc.DocumentElement;
        var channel = rssDoc.SelectSingleNode("/*/default:channel", nsmsgr);
        var nsmsgr = new XmlNamespaceManager(rssDoc.NameTable);
        var root = rssDoc.DocumentElement;
        nsmsgr.AddNamespace("default", root.GetAttribute("xmlns"));
        nsmsgr.AddNamespace("rdf", root.GetAttribute("xmlns:rdf"));
        var channel = rssDoc.SelectSingleNode("/rdf:RDF/default:channel", nsmsgr);