2014-10-02 11 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>` 

Я требую чистого XML как этот

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

`

В любом случае для достижения этой цели. Заранее спасибо.

+0

Как примечание стороны - если вы окажетесь необходимости лишить информации пространства имен из XML, это обычно признак что-то пойдет не так-то - информация пространства имен является неотъемлемой частью идентичности элементов. –

+0

Вот что я на самом деле пытаюсь достичь. У меня было бы несколько записей и их нужно было бы разместить (имя и адрес) под одним единственным корнем (CustomerDetails). Как только у меня появятся эти данные, я буду использовать FOR XML AUTO, ELEMENTS, чтобы разместить их в одном документе с другим пространством имен. –

ответ

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) 
Смежные вопросы