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);