2014-04-02 49 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'命名空间定义。 –