我有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>
`
无论如何要实现这一目标。提前谢谢。
答案 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)