TSQL modify()方法更改xml元素的前缀

TSQL modify()方法更改xml元素的前缀,xml,sql-server-2008,tsql,Xml,Sql Server 2008,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<

我有以下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忽略前缀来更新元素的值:

     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: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>
是否可以在不影响前缀的情况下存档我正在做的事情

与此相比:

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

请注意,名称空间定义是不同的。

从信息的角度来看,没有任何变化。如果您要将这些数据传递给其他不使用自主开发的kludgey解析器而不是像样的XML库的对象,那么它应该可以很好地处理这些数据。主体内部是名称空间中的Fault元素http://schemas.xmlsoap.org/soap/envelope/. 用于标识该名称空间的本地前缀并不重要。问题是,m前缀的名称空间定义相同,但不正确。@Denisvalev-我不会将其描述为不正确。可能是多余的,但是多个前缀与同一名称空间相关联是很好的。@Damien_the_不相信使用不同定义的附加名称空间来向SOAP协议中已经严格定义的Fault元素添加更多自定义信息。从这个角度来看,使用相同的名称空间定义是不正确的。当前缀更改时,最常见的情况是XPATH不匹配来自的XML负载。例如,如果系统向我提供一个XML XPATH输入,则该XPATH将在另一个前端中用于操作元素。预期的元素是以soapenv作为前缀,但实际负载是m:prefix。因此,更改名称空间以使其不被更改,但我不能以任何形式修改属性或前缀。这些是我正在存储的生产负载,所以我需要避免这种情况。我只是不希望前缀是changed@techventure然后,您需要更改消息的生成方式,或者预处理每个soap消息并更改m名称空间定义。