2010-08-18 53 views
1

我測試了SelectSingleNode功能如下從Visual Studio中的XMLNode對象取一個節點:的SelectSingleNode返回任何

 Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable) 
     nsmgr.AddNamespace(ndListItems.Prefix, ndListItems.NamespaceURI) 
     Dim dummy As XmlNode = ndListItems.SelectSingleNode("/listitems", nsmgr) 

在這一點上,我只是試圖讓根節點我正在使用前綴和namespaceURI屬性來添加到XmlNamespaceManager。問題是,當我運行調試器時,虛擬變量沒有被分配,即它沒有。只是要注意,當我分析了前綴和命名空間屬性的值,有如下幾點,PREFIX =「」和的namespaceURI =「http://schemas.microsoft.com/sharepoint/soap」

UPDATE:

試圖改變代碼,但我的虛擬的XMLNode仍然沒有得到設置

Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable) 
     nsmgr.AddNamespace(ndListItems.Prefix, ndListItems.NamespaceURI) 
     Dim dummy As XmlNode = ndListItems.SelectSingleNode("/" + ndListItems.Prefix + "listitems", nsmgr) 

這裏是我想要得到的XML代碼片段,我的終極目標是訪問z的屬性: row node

<listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns="http://schemas.microsoft.com/sharepoint/soap/"> 
<rs:data ItemCount="1"> 
    <z:row ows_Title="Newhire" ows_FirstName="Rick" ows_WorkPhone="954" ows_HomePhone="954" ows_Email="[email protected]" ows_UserID="Rick.Newhire" ows_MetaInfo="9;#" ows__ModerationStatus="0" ows__Level="1" ows_ID="9" ows_owshiddenversion="1" ows_UniqueId="9;#{0F6251A9-D3B8-4B07-A5F8-23BAF5F2237E}" ows_FSObjType="9;#0" ows_Created="2010-08-18 15:56:40" ows_FileRef="9;#Lists/NewHires/9_.000" /> 
</rs:data> 
</listitems> 
+1

你應該顯示你的XML代碼片段,以及如何創建'XmlDocument' – Strelok 2010-08-18 23:33:13

+0

好問題(+1)。請參閱我的回答以解釋問題和解決方案。 – 2010-08-19 02:36:33

回答

0

您明顯遇到了將名稱空間添加到名稱空間管理器的問題。

此外,您的XPath表達式至多會選擇頂層元素,但是您需要z:row

一個簡單,並沒有太優雅的方式來避免名稱空間處理是以下

使用

SelectSingleNode("/*/*/*") 

SelectSingleNode("/*/*[local-name()='data']/*[local-name()='row']") 
+0

嘿迪米特雷,謝謝你回到我身邊。我嘗試了上面的代碼片段,但我仍然沒有得到我的虛擬變量。我發佈了上面的代碼和XML代碼片段,作爲Strelok建議的 – kingrichard2005 2010-08-19 15:59:06

+0

@ kingrichard2005:我完全重新將我的解決方案重寫爲一個根本不使用名稱空間的解決方案。您必須學習更多關於使用名稱空間的知識,但這個話題已經超出了單個問題的解釋範圍。 – 2010-08-19 16:38:26

+0

仍未分配。我在MSDN上找到了一篇關於XML命名空間的文章,希望能澄清一些事情。不知道爲什麼它還沒有被分配,我嘗試了你的兩個解決方案。 – kingrichard2005 2010-08-19 18:59:41

0

在你輸入樣品的QName元組z:row元素是(「#RowsetSchema」,「row」,「z」)。這意味着z前綴的名稱空間URI是#RowsetSchema

如果我的C#代碼沒有出錯,則此ndListItems.Prefix評估爲listitems元素的前綴爲「無」或「」。所以,當你說"/" + ndListItems.Prefix + "listitems"時,它會被評估爲「/ listitems」,它將在沒有命名空間的情況下被解釋爲listitems

所以,我認爲你需要:

Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable) 
nsmgr.AddNamespace("soap", "http://schemas.microsoft.com/sharepoint/soap/") 
nsmgr.AddNamespace("rs", "urn:schemas-microsoft-com:rowset") 
nsmgr.AddNamespace("z", "#RowsetSchema") 
Dim dummy As XmlNode = ndListItems.SelectSingleNode("/soap:listitems/rs:data/z:row", nsmgr) 

編輯:它來找我,我貼過之後。