5
<game xmlns="http://my.name.space" ></game>  

这是我的根元素。我编写了一个存储过程来将元素插入其中。总结一下存储过程,这里是SQL

UPDATE ChessGame SET GameHistory.modify('insert <move><player>black</player><piece>pawn</piece><start>E7</start><end>E6</end></move> as last into (/game)[0]') WHERE Id = @GameId;

现在,当 MSSQL 插入时,还会插入一个空的命名空间,所以结果是这样的

<move xmlns="">
  <player>black</player>
  <piece>king</piece>
  <start>E7</start>
  <end>E6</end>
</move>

现在我尝试使用两者

WITH XMLNAMESPACES(DEFAULT 'http://my.name.space')

GameHistory.modify('declare default element namespace "http://my.name.space"; insert ...')

但我最终得到了无处不在的前缀和每个元素的命名空间声明。

在缺少逻辑来处理 MSSQL 放入的前缀的代码库中会出现问题。最后,我只想在我的 xml 根目录中插入一个新元素并将命名空间留空(使用根默认值?)。我对此很陌生,但据我所知,如果我的根元素中有一个命名空间,那么所有子节点不应该都有我的根的默认命名空间吗?

4

2 回答 2

3

好的,这对我有用:

DECLARE @x XML;
SET @x = '<game xmlns="http://my.name.space" ></game>';

select @x

SET @x.modify(
    ' declare default element namespace "http://my.name.space";
    insert <move><player>black</player><piece>pawn</piece><start>E7</start><end>E6</end></move> as last into (/*:game)[1]'
    )

select @x
于 2009-09-04T19:25:45.193 回答
2
declare @x xml;
select @x='<game xmlns="http://my.name.space" ></game>';
set @x.modify('declare default element namespace "http://my.name.space"; 
    insert <move><player>black</player><piece>pawn</piece>
     <start>E7</start><end>E6</end></move> as last into (/game)[1]');
select @x;

这会产生:

<game xmlns="http://my.name.space">
  <move>
    <player>black</player>
    <piece>pawn</piece>
    <start>E7</start>
    <end>E6</end>
  </move>
</game>

在 SQL 2005 SP2 和 SQL 2008 SP1 上。

此表更新也可以正常工作:

declare @t table (x xml);
insert into @t (x) values ('<game xmlns="http://my.name.space" ></game>');
update @t
set x.modify('declare default element namespace "http://my.name.space"; 
    insert <move><player>black</player><piece>pawn</piece>
       <start>E7</start><end>E6</end></move> as last into (/game)[1]');
select * from @t;
于 2009-09-04T19:17:57.783 回答