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

时间:2010-09-02 17:15:29

标签: 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://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>
     ...

我认为它在默认命名空间中,似乎是“http://purl.org/rss/1.0/”所以我试着这样:

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

XmlNode root = rssDoc.DocumentElement;
XmlNode channel = rssDoc.SelectSingleNode("channel", nsmsgr);

我不行。 XmlNode通道保持为空。

3 个答案:

答案 0 :(得分:3)

您无法将其添加为空。

http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.addnamespace.aspx

  

与之关联的前缀   添加名称空间。使用   String.Empty添加默认值   命名空间。注意如果   XmlNamespaceManager将用于   解析XML路径中的命名空间   语言(XPath)表达式,前缀   必须指定。如果是XPath   表达式不包含前缀,   假设命名空间   统一资源标识符(URI)是   空命名空间。更多   有关XPath表达式的信息   和XmlNamespaceManager,请参阅   XmlNode.SelectNodes和   XPathExpression.SetContext methods.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);

答案 1 :(得分:-1)

只是做:

XmlNode channel = rssDoc.SelectSingleNode(@"//channel");

答案 2 :(得分:-1)

XmlElement root = rssDoc.DocumentElement;

XmlNode channel = root.SelectSingleNode("/channel");

这将为您提供通道节点,然后您可以引用,属性,值,InnerXML,FirstChild等从该节点提取数据。

* edit:应该是XmlElement而不是Node