2011-12-12 70 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