2011-12-12 144 views
0

我想刪除正在存儲在數據庫的類型化xml列中的菜單xml中的一些節點。
片段從菜單XML -SQL Server - xml類型列 - XML DML

<menu xmlns="http://xxx" ..> 
<menuItem name="Menu1"> 
    <menuItem name="SubMenu1"> 
     <role>role1</role> 
     <url target="webPage1.aspx" /> 
    </menuItem> 
</menuItem> 

我試圖刪除<role>menuItem = "SubMenu1"下使用以下XML DML -

UPDATE [dbo].[MenuTest] 
SET xmlMenu.modify(' 
    declare namespace ns="http://xxx"; 
    delete(/ns:menu/ns:menuItem[@name="Menu1"]/ns:menuItem[@name="SubMenu1"]/ns:role[1]) 
') 

但收到此錯誤:

Msg 6965, Level 16, State 1, Line 1
XML Validation: Invalid content. Expected element(s):http://xxx:role where element 'http://xxx:url' was specified.

可以請貴我在這裏失去了什麼。

謝謝!

回答

1

看起來您的XML列被連接到一個XML模式,該模式在<url>節點之前需要一個<role>節點。

你在這裏發佈的內容工作得很好。

declare @T table 
(
    xmlMenu xml 
) 

insert into @T values 
('<menu xmlns="http://xxx"> 
    <menuItem name="Menu1"> 
     <menuItem name="SubMenu1"> 
     <role>role1</role> 
     <url target="webPage1.aspx" /> 
     </menuItem> 
    </menuItem> 
    </menu>') 


UPDATE @T 
SET xmlMenu.modify(' 
    declare namespace ns="http://xxx"; 
    delete(/ns:menu/ns:menuItem[@name="Menu1"]/ns:menuItem[@name="SubMenu1"]/ns:role[1]) 
') 

結果

<menu xmlns="http://xxx"> 
    <menuItem name="Menu1"> 
    <menuItem name="SubMenu1"> 
     <url target="webPage1.aspx" /> 
    </menuItem> 
    </menuItem> 
</menu> 
+0

好知道:-)也可以請指導我怎麼能刪除文本「role1上」節點,所以如果我有多個節點,我想只有那些不必刪除特定的文本值。 – iniki

+0

@iniki - 用'ns:role [']替換'ns:role [1]'。 =「role1」]'它將刪除所有具有值'role1'的''節點。 –

+0

感謝您的回覆,但我收到此錯誤 - 無法隱式地將'fn:data()'應用於複雜內容元素,在推斷類型元素中找到類型'xs:anyType'(ns {xxx}:role, XS:anyType的)」。 – iniki