2014-04-02 122 views
0

我有下面的XML:TSQL修改()方法更改XML元素的前綴

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soapenv:Body> 
      <soapenv:Fault xmlns:m="http://schemas.xmlsoap.org/soap/envelope/"> 
       <first>value1</first> 
       <last>value2</last> 
      </soapenv:Fault> 
     </soapenv:Body> 
    </soapenv:Envelope> 

所有我想要做的就是更新使用給定XPATH使用下面的代碼(忽略作爲前綴)的<first>元素的值:

 SET ANSI_PADDING ON;    
    SET ANSI_WARNINGS ON;    
    declare @xmlTBL table(tmlXML xml);    
    insert into @xmlTBL(tmlXML)    
    values('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <soapenv:Fault xmlns:m="http://schemas.xmlsoap.org/soap/envelope/"> <first>valuu1</first> <last>value2</last> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>'); 

    UPDATE @xmlTBL SET tmlXML.modify('insert text{"TEST"} into (/*:Envelope/*:Body/*:Fault/first[1] [not(node()) and not(text())])[1]'); 

元價值的作品的更新,但什麼也發生的是元素<soapenv:Fault>現已成爲<m:Fault>,如下圖所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soapenv:Body> 
      <m:Fault xmlns:m="http://schemas.xmlsoap.org/soap/envelope/"> 
       <first>TEST</first> 
       <last>value2</last> 
      </m:Fault> 
     </soapenv:Body> 
    </soapenv:Envelope> 

是否有可能將我正在做的事情存檔而沒有影響前綴?

+0

從*信息*的角度來看,沒有任何改變。如果你將這些數據傳遞給其他沒有使用本土化的kludgey解析器而不是一個體面的XML庫的數據,它應該處理這些數據。 'Body'中的內容是來自命名空間'http:// schemas.xmlsoap.org/soap/envelope /'的'Fault'元素。使用什麼本地前綴來標識該名稱空間並不重要。 –

+0

問題是,'m'前綴的名稱空間定義不正確。 –

+0

@DenisValeev - 我不會說這是不正確的。也許是冗餘的,但是多個前綴與相同的命名空間關聯是完全正確的。 –

回答

0

比較本:

declare @xmlOriginal xml = ' 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <soapenv:Fault xmlns:m="urn:SomeEntity/1.0"> 
     <faultcode>a</faultcode> 
     <faultstring>b</faultstring> 
     <faultactor>c</faultactor> 
    </soapenv:Fault> 
    </soapenv:Body> 
</soapenv:Envelope>' 

declare @xml xml = @xmlOriginal 

set @xml.modify('insert text{"TEST"} into (/*:Envelope/*:Body/*:Fault/faultcode[1])[1]') 

select @xml, @xmlOriginal 

注意命名空間的定義是不同的。

+0

因此,改變名稱空間以使不同的東西阻止它被更改,但我不能以任何形式修改屬性或前綴。這些是我正在存儲的生產有效載荷,所以我需要避免這種情況。我只是不希望前綴被改變 – ke3pup

+0

@techventure然後你需要改變消息的生成方式或預處理每個soap消息並更改'm'命名空間定義。 –