我正在尝试使用XmlSlurper处理XML字符串的一部分(在重要的情况下,在WS Lite插件中)。这是一个示例XML字符串:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetBusinessObjectByPublicIdResponse>
<GetBusinessObjectByPublicIdResult>
<BusinessObject REF="21cf6434ae" Name="Incident" ID="1518">
<FieldList>
<Field REF="f5b2ef7e04" Name="ID">
93e5346ec110eee46ea095
</Field>
[tons more field entries]
</FieldList>
</BusinessObject>
</GetBusinessObjectByPublicIdResult>
</GetBusinessObjectByPublicIdResponse>
</soap:Body>
</soap:Envelope>
我有body节点,如果我尝试只访问GetBusinessObjectByPublicIdResponse节点或GetBusinessObjectByPublicIdResult节点,一切似乎都运行正常。但是,如果我尝试更深入地使用XML来访问BusinessObject节点(或更深层次),那就是当事情停止工作时。
例如,以下代码:
def node = body.GetBusinessObjectByPublicIdResponse[0].GetBusinessObjectByPublicIdResult[0]
返回正确的NodeChild对象。但是,如果我执行以下操作:
def node = body.GetBusinessObjectByPublicIdResponse[0].GetBusinessObjectByPublicIdResult[0].BusinessObject[0]
我得到一个NoChildren对象。看起来好像没有解析BusinessObject节点(以及它的所有子节点)。如果我执行以下操作,它们将作为字符串存在:
body.GetBusinessObjectByPublicIdResponse[0].GetBusinessObjectByPublicIdResult[0].text()
但它们不作为已解析的对象存在。
这是我第一次在Groovy中处理XML,所以我可能做错了什么,或者事情就好了。任何帮助都非常感谢。
答案 0 :(得分:0)
这适合我。
def xml = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
| <GetBusinessObjectByPublicIdResponse>
| <GetBusinessObjectByPublicIdResult>
| <BusinessObject REF="21cf6434ae" Name="Incident" ID="1518">
| <FieldList>
| <Field REF="f5b2ef7e04" Name="ID">93e5346ec110eee46ea095</Field>
| </FieldList>
| </BusinessObject>
| </GetBusinessObjectByPublicIdResult>
| </GetBusinessObjectByPublicIdResponse>
</soap:Body>
</soap:Envelope>""".stripMargin().stripIndent()
def parse = new XmlSlurper().parseText( xml )
assert '93e5346ec110eee46ea095' == parse.Body
.GetBusinessObjectByPublicIdResponse
.GetBusinessObjectByPublicIdResult
.BusinessObject
.FieldList
.Field
.text()
在有一个NodeList之前,您不必处理NodeList。在这里,我看到唯一可能的节点列表为FieldList
。
答案 1 :(得分:0)
原来问题是XML字符串(它是一个SOAP响应)没有正确格式化。所有未解析的节点实际上都在使用
< and >
而不是&lt;和&gt;。但是,XmlSlurper实际上是将符号转换为&lt;和&gt;但只是没有解析它们。因此,在XmlSlurper完成它之后查看XML会使一切看起来都正确。