2014-10-02 113 views
1

我有CustoInfo XML,這是從另一個更大的表中存儲在臨時表中的一些操作。我想剝離根節點並返回其下的所有元素,而不將名稱空間添加到任何根的子節點。從XML中刪除根節點

`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>` 

我需要這樣的

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

`

清潔XML反正來實現這一目標。提前致謝。

+0

作爲一個側面說明 - 如果你發現自己需要從XML剝離命名空間信息,它通常是出亂子的地方的跡象 - 命名空間信息提供了元素的身份的重要組成部分。 – 2014-10-02 08:20:18

+0

這是我真正想要實現的。我會有多個記錄,並且必須將它們全部(名稱和地址)放在一個根目錄下(CustomerDetails)。一旦我掌握了這些細節,我就會使用FOR XML AUTO,ELEMENTS將它們放在具有不同命名空間的單個文檔中。 – 2014-10-02 10:00:18

回答

1

您可以將其轉換爲nvarchar(max),刪除名稱空間聲明,然後再次轉換回xml

SELECT cast(replace(cast(CustInfo as nvarchar(max)), 'xmlns="Corp.Info.Customer"', '') 
      as xml).query('Customer/*') 
FROM @tempCustomerInfo 
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)