【问题标题】:SelectSingleNode and namespace - can't find nodes (using namespace mgr)SelectSingleNode 和命名空间 - 找不到节点(使用命名空间管理器)
【发布时间】:2011-03-10 01:05:00
【问题描述】:

我收到了来自合作伙伴公司的相对复杂的 xml 消息。我需要解析 xml 才能使用它。我让它工作正常,然后他们改变了消息,现在我的 SelectSingleNode 命令都不起作用。

消息的结构。请注意带有嵌入式 xml 文档的 CDATA 对象。不确定这是否重要。我能够剔除 dataContent 对象,所以它不应该有所作为。这是我正在加载到 XmlDocument 中的内容:

<ns5:dataContent xmlns:ns2="http://test/common/v1" 
                     xmlns="http://test/schema/common" 
                     xmlns:ns4="http://test/credentialing/stuff/v1" 
                     xmlns:ns3="http://test/schema/ims/common/v1" 
                     xmlns:ns5="http://test/schema/v1">

        <createdBy>Micky</createdBy>
        <createdAt>2011-03-08T17:00:27.050-05:00</createdAt>
        <ns5:Id>39</ns5:Id>
        <ns5:Type>4</ns5:Type>
     -- lots more data --
</ns5:dataContent>

我的代码很简单

   var xmlDoc = new XmlDocument();
   xmlDoc.Load(new StringReader(CDATA content));
   var xmlNsM = new XmlNamespaceManager(xmlData.NameTable);
   xmlNsM.AddNamespace(String.Empty, @"http://test/schema/common\");
   xmlNsM.AddNamespace("ns5", @"http://test/schema/v1\");
   xmlNsM.AddNamespace("m", @"http://test/message/v1\");

//This works
   var order = xmlDoc.ChildNodes[0];

//This returns null
   var ID = order.SelectSingleNode("ns5:Id", xmlNsM);

我可以看到 xmlDoc 正在正确加载。我尝试将所有 6 个命名空间添加到 xmlNsM,但得到相同的结果。我的 SelectSingleNodes 现在都不工作了。

我发现的关于这个主题的每一篇文章都说只使用命名空间管理器,但我已经知道了,所以这不是一个很有成效的下午。

【问题讨论】:

  • 究竟是什么你加载到XmlDocument?只是 CDATA 内容?如果是这样,那么请编辑您的问题以消除无关的 XML。

标签: c# xml selectsinglenode


【解决方案1】:

只是阅读我认为您正确使用命名空间管理器的代码。您的问题是 XPath 查询。 “ns5:Id”不是高级文档的子级,ChildNodes 只会返回下一级。你需要寻找死者。试试:

var root = doc.DocumentElement;
var ID = root.SelectSingleNode("//ns5:Id", xmlNsM); 

这不是最有效的,因为它会在整个文档中找到所有匹配项。看看这里的一些例子:http://msdn.microsoft.com/en-us/library/ms256086.aspx

【讨论】:

    【解决方案2】:

    通常情况下,经过数小时的研究后,解决方案很简单。我添加到 NSManager 的命名空间在右引号(“http://test/schema/v1\”)前面有一个斜杠。当然,这是一个分隔符,但因为我只是从原始 xml 复制并粘贴了命名空间,所以它被包含在内。删除它们后,我开始在 ns5 命名空间中查找我需要的所有字段。

    由于某种原因,我看不到没有命名空间的元素,但由于我不需要这些字段 ATM,我稍后会弄清楚。

    【讨论】:

      【解决方案3】:

      @ErnieL 的答案看起来不错 (+1)。也可能有问题

        xmlNsM.AddNamespace(String.Empty, @"http://test/schema/common\");
      

      因为xpath does not like defaultnamespaces :-(。如果@ErnieL 答案仍然不起作用,请将其更改为

        xmlNsM.AddNamespace("default", @"http://test/schema/common\");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多