【问题标题】:Parse xml using XmlSlurper in Groovy在 Groovy 中使用 XmlSlurper 解析 xml
【发布时间】:2016-12-29 07:04:24
【问题描述】:

我有一个 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 标签中的“类型”是否为IdentityModel

我尝试如下访问type,但没有成功:-

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

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

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

请帮助我在multiRef标签中访问type

编辑: 请注意,我想解析 multiRef 标签中的 type 而不使用像 multiRef.'@xsi:type' 这样的名称空间,因为我的 namespace 可能会改变。我想要的是multiRef标签有一个属性type,它的值是IdentityModel..只有当它存在时,我才想阅读vixId。 另请注意,在 groovy 1.8 中,我使用 multiRef.@type 在没有命名空间的情况下解析它,但自从我将 groovy 更新到 2.4.7 后它就停止工作了

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

【问题讨论】:

  • xml.Body.multiRef.'xsi:@type'.text() ?
  • @har07 : 不,但是xml.Body.multiRef.'@xsi:type'.text() 返回了ns9:IdentityModel .... 感谢您的帮助,如果有任何方法可以只获得IdentityModel 作为响应...如果现在,我将使用字符串操作来实现它:D .. 谢谢
  • 啊,错字。我就是这个意思

标签: xml groovy xml-parsing xmlslurper


【解决方案1】:

默认情况下,XMLSlurper 不支持命名空间。这可以通过使用 declareNamespace 方法声明命名空间来打开。

def xml = new XmlSlurper().parseText(xmlMsg)
             .declareNamespace('xsi' : 'http://www.w3.org/2001/XMLSchema-instance')
def vixId = xml.Body.multiRef.vixId.text()
println vixId

def type = xml.Body.multiRef.@'xsi:type'.text()
println type

输出是:

13364719
ns9:IdentityModel

这将返回字符串值ns9:IdentityModel,它是 XML 中的确切值。如果想要去除命名空间前缀,可以执行type = type.replace('ns9:','') 之类的操作以得到“IdentityModel”。

【讨论】:

  • 感谢您的回复,但是当我使用早期版本的 groovy(1.8) 时,我使用 :- def xml = new XmlSlurper(FactorySupport.createSaxParserFactory().newSAXParser().GETXMLReader()).parseText(xmlMsg) 然后使用 xml.Body.multiRef.@type ..... 现在我已升级到 groovy 2.4.7,因为我无法直接使用 @type 访问 IdentityModel....你能建议任何方法,以便只有使用 @type 才能工作
  • 请注意,如果我按照@har07 建议的xml.Body.multiRef.'xsi:@type'.text() 不使用declareNameSpace 方法进行操作,它会起作用
【解决方案2】:

还没有完全找到我要找的东西,但我暂时使用了一个临时解决方法:-

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

这里attributes() 方法将给出一个包含所有属性、它们的命名空间和值的数组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多