在Groovy中使用XmlSlurper解析xml

时间:2016-12-29 07:04:25

标签: xml groovy xml-parsing xmlslurper

我有一个xml响应,如下所示: -

<?xml version="1.0" encoding="UTF-8"?>
<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>
      <multiRef xmlns:ns9="http://hero.ar.vixo.in" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" id="id2" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns9:IdentityModel">
         <vixId xsi:type="xsd:int">13364719</vixId>
      </multiRef>
   </soapenv:Body>
</soapenv:Envelope>

此回复存储在String名称xmlMsg中 我试图按如下方式解析它: -

def xml = new XmlSlurper().parseText(xmlMsg);
def vixId = xml.Body.multiRef.vixId.text()

但问题是,在阅读vixId之前,我想验证multiRef代码中的'type'是IdentityModel

我尝试按以下方式访问type,但徒劳无功: -

def vixId = xml.Body.multiRef.@type.text()

请注意,我可以使用以下方式访问id代码中的multiRef: -

 def vixId = xml.Body.multiRef.@id.text()

请帮助我访问type代码

中的multiRef

编辑: 请注意,我想解析type标记中的multiRef,而不使用multiRef.'@xsi:type'之类的名称空间,因为我的namespace可能会发生变化。我想要的是multiRef标记的属性type,其值为IdentityModel ..只有在那里,我才能阅读vixId。 另请注意,使用groovy 1.8我正在使用multiRef.@type解析它而不使用命名空间但是自从我将groovy更新为2.4.7后它就停止了工作

PS: - 我在处理xmls方面相当新颖

2 个答案:

答案 0 :(得分:1)

默认情况下,XMLSlurper不支持名称空间。这可以通过使用declareNamespace方法声明名称空间来打开。 def xml = new XmlSlurper()。parseText(xmlMsg)              .declareNamespace(&#39; xsi&#39;:&#39; http://www.w3.org/2001/XMLSchema-instance') def vixId = xml.Body.multiRef.vixId.text() println vixId def type = xml.Body.multiRef。@&#39; xsi:type&#39; .text() println类型 输出是: 13364719 NS9:IdentityModel 这将返回字符串值ns9:IdentityModel,它是XML中的确切值。如果要删除命名空间前缀,可以执行类似type = type.replace(&#39; ns9:&#39;,&#39;&#39;)的操作,最终得到&#34; IdentityModel&#34; 。

答案 1 :(得分:0)

我找不到我想要的东西,但我暂时使用了临时解决方法: -

    if (xml.Body.multiRef.attributes().toString().contains("IdentityModel")) {
        vixId = xml.Body.multiRef.vixId.text()
    }

此处attributes()方法将提供所有属性,其命名空间和值

的数组