从XML中剥离Root节点

时间:2014-10-02 08:02:49

标签: sql-server-2008 xquery-sql

我有CustoInfo XML,它存储在另一个较大的表的临时表中以进行一些操作。我想剥离根节点并返回位于它下面的所有元素,而不将命名空间添加到任何root的子节点。

 `DECLARE @tempCustomerInfo TABLE
(
ID INT IDENTITY(1,1),
CustInfo XML NULL
)

DECLARE @CustInfo XML
SET @CustInfo = '<Customer xmlns="Corp.Info.Customer"><Name><FName>Mark</FName>     <MName>A</MName><LName>Antony</LName></Name><Address><Street>Clare</Street><City>Clarkson</City></Address></Customer>'
 INSERT INTO @tempCustomerInfo SELECT @CustInfo

;WITH XMLNAMESPACES(DEFAULT 'Corp.Info.Customer')   
SELECT CustInfo.query('/Customer/*') FROM @tempCustomerInfo`

它返回如下输出 - 在每个元素中添加了命名空间。

   `<p1:Name xmlns:p1="Corp.Info.Customer">
  <p1:FName>Mark</p1:FName>
  <p1:MName>A</p1:MName>
 <p1:LName>Antony</p1:LName>
 </p1:Name>
 <p2:Address xmlns:p2="Corp.Info.Customer">
 <p2:Street>Clare</p2:Street>
<p2:City>Clarkson</p2:City>
</p2:Address>`

我需要一个像这样的清洁xml

 `<Name >
  <FName>Mark</FName>
 <MName>A</MName>
 <LName>Antony</LName>
</Name>
<Address >
 <Street>Clare</Street>
<City>Clarkson</City>

`

无论如何要实现这一目标。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以转换为nvarchar(max),删除命名空间声明,然后再次转回xml

SELECT cast(replace(cast(CustInfo as nvarchar(max)), 'xmlns="Corp.Info.Customer"', '')
            as xml).query('Customer/*')
FROM @tempCustomerInfo

答案 1 :(得分:0)

DECLARE @tempCustomerInfo TABLE
(
ID INT IDENTITY(1,1),
CustInfo XML NULL
)

DECLARE @CustInfo XML
SET @CustInfo = '<Customer xmlns="Corp.Info.Customer"><Name><FName>Mark</FName>     <MName>A</MName><LName>Antony</LName></Name><Address><Street>Clare</Street><City>Clarkson</City></Address></Customer>'
 INSERT INTO @tempCustomerInfo SELECT @CustInfo
;


WITH XMLNAMESPACES(DEFAULT 'Corp.Info.Customer')  
SELECT t.c.query('declare default element namespace "Corp.Info.Customer";.')
FROM @CustInfo.nodes('/Customer/*') t(c)