2015-02-23 88 views
1

我遇到了選擇具有MSXML中的名稱空間的節點的問題。該XML已被ADODB記錄生成的,看起來像這樣:XML DOM SelectSingleNode()與名稱空間不返回節點

<xml> 
    <s:Schema id="RowsetSchema" > 
     <s:ElementType name="row" content="eltOnly" rs:updatable="true" > 
      <s:AttributeType name="ID" rs:number="1" rs:basecatalog="SystemDB" rs:basetable="pagehits" rs:basecolumn="ID" rs:keycolumn="true" rs:autoincrement="true" > 
       <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true" rs:maybenull="false" /> 
      </s:AttributeType> 
      <s:AttributeType name="SessionCode" rs:number="2" rs:writeunknown="true" rs:basecatalog="SystemDB" rs:basetable="pagehits" rs:basecolumn="SessionCode" > 
       <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="36" rs:fixedlength="true" rs:maybenull="false" /> 
      </s:AttributeType> 
      <s:AttributeType name="PagePath" rs:number="3" rs:writeunknown="true" rs:basecatalog="SystemDB" rs:basetable="pagehits" rs:basecolumn="PagePath" > 
       <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="100" rs:maybenull="false" /> 
      </s:AttributeType> 
      <s:AttributeType name="PersID" rs:number="4" rs:writeunknown="true" rs:basecatalog="SystemDB" rs:basetable="pagehits" rs:basecolumn="PersID" > 
       <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true" rs:maybenull="false" /> 
      </s:AttributeType> 
      <s:AttributeType name="PersonInfo" rs:number="5" rs:writeunknown="true" rs:basecatalog="SystemDB" rs:basetable="pagehits" rs:basecolumn="PersonInfo" > 
       <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="100" rs:maybenull="false" /> 
      </s:AttributeType> 
      <s:AttributeType name="CRD" rs:number="6" rs:writeunknown="true" rs:basecatalog="SystemDB" rs:basetable="pagehits" rs:basecolumn="CRD" > 
       <s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="3" rs:precision="23" rs:fixedlength="true" rs:maybenull="false" /> 
      </s:AttributeType> 
      <s:extends type="rs:rowbase" /> 
     </s:ElementType> 
    </s:Schema> 
    <rs:data> 
     <z:row ID="1" SessionCode="2CA43F6A-3951-42C5-8FF4-C6409026ED3A" PagePath="/pages/home/home.asp" PersID="2" PersonInfo="User395959" CRD="2014-04-07T23:30:38.090000000" /> 
     <z:row ID="2" SessionCode="2CA43F6A-3951-42C5-8FF4-C6409026ED3A" PagePath="/pages/home/home.asp" PersID="2" PersonInfo="User395959" CRD="2014-04-07T23:30:51.180000000" /> 
     <z:row ID="3" SessionCode="2CA43F6A-3951-42C5-8FF4-C6409026ED3A" PagePath="/pages/home/home_v02.asp" PersID="2" PersonInfo="User395959" CRD="2014-04-07T23:30:51.240000000" /> 
     <z:row ID="4" SessionCode="2CA43F6A-3951-42C5-8FF4-C6409026ED3A" PagePath="/pages/home/home.asp" PersID="2" PersonInfo="User395959" CRD="2014-04-07T23:30:54.180000000" /> 
     <z:row ID="5" SessionCode="2CA43F6A-3951-42C5-8FF4-C6409026ED3A" PagePath="/pages/home/home_v02.asp" PersID="2" PersonInfo="User395959" CRD="2014-04-07T23:30:54.213000000" /> 
    </rs:data> 
</xml> 

我已加載XML字符串到一個名爲oXMLDoc的XML文檔。我現在要選擇S:架構節點,所以我已經使用這個代碼選擇節點,並報告所選擇的節點對象的類型:

oXMLDoc.setProperty "SelectionNamespaces", " xmlns:s='http://dev.kauupm.com/ns_s' " 
dim oSchemaNode: set oSchemaNode = oXMLDoc.DocumentElement.SelectSingleNode("//s:Schema") 
oTracer.Trace "", "Schema node is type: " & typeName(oSchemaNode) 

或跟蹤報告的結果是類型爲Nothing ,所以節點沒有找到。

我已經嘗試了許多xpath的不同組合,無濟於事。但是,如果在將XML文本加載到XML對象中之前從XML文本中刪除所有名稱空間,那麼選擇沒有名稱空間的Schema節點,它可以正常工作!所以,問題出在命名空間的某個地方,但我看不到我做錯了什麼,我感到非常困惑。

我正在使用Msxml2.FreeThreadedDOMDocument.6.0。

任何幫助非常讚賞 - 約翰

+2

您發佈不聲明任何命名空間(它沒有了xmlns =「HTTP://dev.kauupm.com/ns_s」的XML屬性實際上它應該申報所有你需要的前綴。 。 – helderdarocha 2015-02-23 18:40:51

+1

@helderdarocha感謝您的評論 - 我認爲這讓我對問題的答案 - 我將很快發佈。 – JohnRC 2015-02-24 15:53:35

回答

1

此問題的原因在不理解這一點的前綴代表的命名空間必須匹配奠定。由ADODB記錄生成XML源都有自己的命名空間中聲明如下:

xmlns:rs='urn:schemas-microsoft-com:rowset' 
xmlns:z='#RowsetSchema' 
xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' 
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' 

我在我的setProperty參數使用不同的命名空間。因此,儘管我在selectSingleNode調用的路徑中使用了s:前綴,但相應的名稱空間與XML中s:前綴的名稱空間不匹配。

所以我改變了對的setProperty

'// Set the namespaces used for selection - they must match the namespaces from Microsoft 
oXMLDoc.setProperty "SelectionNamespaces", " xmlns:xsl='http://www.w3.org/1999/XSL/Transform' " _ 
            & " xmlns:rs='urn:schemas-microsoft-com:rowset' " _ 
            & " xmlns:z='#RowsetSchema' " _ 
            & " xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' " _ 
            & " xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' " 

,現在,它完美的作品。

我還沒有意識到,前綴只是一個代表名稱空間的符號,它是必須匹配的名稱空間,而不僅僅是前綴。

非常感謝@helderdarocha。

約翰

相關問題