我正在尝试从此文档中获取频道元素。
<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通道保持为空。
答案 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