使用groovy解析带有转义xml的soap消息时无法检索数据

使用groovy解析带有转义xml的soap消息时无法检索数据,groovy,Groovy,我尝试从soap消息中选择节点的值(使用gt和lt符号),但无法做到这一点,我只能获取body(root.body),而其他节点不可见,结果为空。我做错了什么? 谢谢 import groovy.util.slurpersupport.Node 导入groovy.util.slurpersupport.NodeChild 导入groovy.xml.XmlUtil 字符串源= ''' ns0:GetListBy\u资格响应xmlns:ns0=“urn:WS\u CTM\u People\u ICE

我尝试从soap消息中选择节点的值(使用gt和lt符号),但无法做到这一点,我只能获取body(root.body),而其他节点不可见,结果为空。我做错了什么? 谢谢

import groovy.util.slurpersupport.Node
导入groovy.util.slurpersupport.NodeChild
导入groovy.xml.XmlUtil
字符串源=
'''
ns0:GetListBy\u资格响应xmlns:ns0=“urn:WS\u CTM\u People\u ICEVA”
ns0:getListValues
ns0:Person\u IDPPL000000301739/ns0:Person\u ID
ns0:提交者管理员/ns0:提交者
ns0:配置文件\状态已启用/ns0:配置文件\状态
ns0:Locale2en_US/ns0:Locale2
ns0:VIPNo/ns0:VIP
ns0:客户敏感度标准/ns0:客户敏感度
/ns0:getListValues
/ns0:GetListBy_资格响应
'''
def root=new XmlSlurper().parseText(源代码)
def Submitter=root.Body.GetListBy_QualificationResponse.getListValues.'*'。查找{node->
node.name()=“提交者”
}
这是因为xml被转义了。为了能够检索数据属性,需要取消扫描xml字符串并传递它
XmlSlurper

以下是如何做到这一点:

String source='''<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      &lt;ns0:GetListBy_QualificationResponse xmlns:ns0=&quot;urn:WS_CTM_People_ICEVA&quot;&gt;
         &lt;ns0:getListValues&gt;
            &lt;ns0:Person_ID&gt;PPL000000301739&lt;/ns0:Person_ID&gt;
            &lt;ns0:Submitter&gt;soehler&lt;/ns0:Submitter&gt;
            &lt;ns0:Profile_Status&gt;Enabled&lt;/ns0:Profile_Status&gt;
            &lt;ns0:Locale2&gt;en_US&lt;/ns0:Locale2&gt;
            &lt;ns0:VIP&gt;No&lt;/ns0:VIP&gt;
            &lt;ns0:Client_Sensitivity&gt;Standard&lt;/ns0:Client_Sensitivity&gt;
         &lt;/ns0:getListValues&gt;
      &lt;/ns0:GetListBy_QualificationResponse&gt;
   </soapenv:Body>
</soapenv:Envelope>'''

//map the unescape characters
def map = ['&lt;' : '<', '&gt;' : '>', '&quot;' : '"', '&apos;':'\'', '&amp;':'&']
//Replace them in source string
map.collect {k,v -> source = source.replaceAll(k,v)}
//Now parse it
def root = new XmlSlurper().parseText(source)
//Get the submitter
def submitter = root.'**'.find { it.name() == 'Submitter' }
println submitter
字符串源=“”
ns0:GetListBy\u资格响应xmlns:ns0=“urn:WS\u CTM\u People\u ICEVA”
ns0:getListValues
ns0:Person\u IDPPL000000301739/ns0:Person\u ID
ns0:提交者管理员/ns0:提交者
ns0:配置文件\状态已启用/ns0:配置文件\状态
ns0:Locale2en_US/ns0:Locale2
ns0:VIPNo/ns0:VIP
ns0:客户敏感度标准/ns0:客户敏感度
/ns0:getListValues
/ns0:GetListBy_资格响应
'''
//映射unescape角色
def map=['':'','&apos;'':'\'',&;'':'&']
//在源字符串中替换它们
map.collect{k,v->source=source.replaceAll(k,v)}
//现在解析它
def root=new XmlSlurper().parseText(源代码)
//获取提交者
def submitter=root.'**'。查找{it.name()=='submitter'}
println提交者

您可以快速在线尝试

非常感谢!但我认为XmlSlurper已经有了unescape字符,因为root.Body的输出显示正确。SlavondeR,不,如果您查看源字符串,只有部分xml是unescape的,部分是转义的,这就是问题所在。希望它能满足你的需求。Rao,如果你能帮忙的话,还有一个问题。当我在unescape字符后尝试在xml中解析soap时,我收到错误:[致命错误]:1:158:不允许处理指令目标与“[xX][mM][lL]”匹配。我怎么处理呢?谢谢@slavonderave,你在用soapui吗?也许你可以创建一个新的问题,尽可能详细。或者看
String source='''<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      &lt;ns0:GetListBy_QualificationResponse xmlns:ns0=&quot;urn:WS_CTM_People_ICEVA&quot;&gt;
         &lt;ns0:getListValues&gt;
            &lt;ns0:Person_ID&gt;PPL000000301739&lt;/ns0:Person_ID&gt;
            &lt;ns0:Submitter&gt;soehler&lt;/ns0:Submitter&gt;
            &lt;ns0:Profile_Status&gt;Enabled&lt;/ns0:Profile_Status&gt;
            &lt;ns0:Locale2&gt;en_US&lt;/ns0:Locale2&gt;
            &lt;ns0:VIP&gt;No&lt;/ns0:VIP&gt;
            &lt;ns0:Client_Sensitivity&gt;Standard&lt;/ns0:Client_Sensitivity&gt;
         &lt;/ns0:getListValues&gt;
      &lt;/ns0:GetListBy_QualificationResponse&gt;
   </soapenv:Body>
</soapenv:Envelope>'''

//map the unescape characters
def map = ['&lt;' : '<', '&gt;' : '>', '&quot;' : '"', '&apos;':'\'', '&amp;':'&']
//Replace them in source string
map.collect {k,v -> source = source.replaceAll(k,v)}
//Now parse it
def root = new XmlSlurper().parseText(source)
//Get the submitter
def submitter = root.'**'.find { it.name() == 'Submitter' }
println submitter