2011-03-10 108 views
2

我有一個相對複雜的XML消息,我從合作伙伴公司收到。我需要解析XML以使用它。我的工作正常,然後他們改變了所有的消息,現在我的SelectSingleNode命令都沒有工作。SelectSingleNode和namespace - 找不到節點(使用命名空間管理器)

消息的結構。注意帶有嵌入式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現在都不起作用。

我在這個主題上發現的每一篇文章都說只使用命名空間管理器,但我已經知道這樣,所以它不是一個非常富有成效的下午。

+0

究竟是什麼你加載到'XmlDocument'?只是CDATA內容?如果是這樣,那麼請編輯您的問題以消除無關的XML。 – 2011-03-10 03:18:23

回答

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

0

@ErnieL答案看起來不錯(+1)。可能還有蜜蜂的一個問題是

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

因爲xpath does not like defaultnamespaces :-(。如果@ErnieL答案仍然不列入工作,將其更改爲

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

那麼作爲典型小時的尋找小時後的情況在這個問題上,解決方案很簡單,我添加到NSManager的命名空間在結尾引號(「http:// test/schema/v1 \」)前面有一個正斜槓,當然這是一個分隔符,但因爲我剛剛複製並粘貼了包含它的原始xml的命名空間。一旦我刪除它們,我開始在ns5命名空間中找到所需的所有字段即

由於某些原因,我看不到名稱空間不存在的元素,但由於我不需要這些字段的ATM,因此我會在稍後解決。