SelectSingleNode和namespace - 找不到节点(使用命名空间mgr)

时间:2011-03-10 01:05:01

标签: c# xml selectsinglenode

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

消息的结构。请注意带有嵌入式xml文档的CDATA对象。不确定这是否重要。我能够通过tweeze输出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现在都无法正常工作。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

由于某种原因,我看不到没有名称空间的元素,但由于我不需要那些字段ATM,我稍后会想到这一点。

答案 2 :(得分:0)

@ErnieL答案看起来不错(+1)。

可能还有一个问题
  xmlNsM.AddNamespace(String.Empty, @"http://test/schema/common\");

因为xpath does not like defaultnamespaces :-(。如果@ErnieL答案仍无效,请将其更改为

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