【问题标题】:Getting single node from xml document c#从xml文档c#中获取单个节点
【发布时间】:2010-09-02 17:15:29
【问题描述】:

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

<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 通道保持为空。

【问题讨论】:

  • 你确定你的 XPath 是正确的吗?我认为您希望在指定子节点之前为根节点指定一个“*”。
  • @marc_s:是的,但如果他使用“*”来接受任何根,则不会。

标签: c# xml


【解决方案1】:

您不能将其添加为 Empty。

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 方法。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);

【讨论】:

    【解决方案2】:

    只要做:

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

    【讨论】:

    • @marc_s:“rdf”前缀是可选的。看我的回答。
    【解决方案3】:
    XmlElement root = rssDoc.DocumentElement;
    
    XmlNode channel = root.SelectSingleNode("/channel");
    

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

    *edit: 应该是 XmlElement 而不是 Node

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      相关资源
      最近更新 更多