XmlSlurper不解析整个XML

时间:2014-09-15 20:36:40

标签: java xml parsing groovy xmlslurper

我正在尝试使用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,所以我可能做错了什么,或者事情就好了。任何帮助都非常感谢。

2 个答案:

答案 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响应)没有正确格式化。所有未解析的节点实际上都在使用

&lt; and &gt;

而不是&lt;和&gt;。但是,XmlSlurper实际上是将符号转换为&lt;和&gt;但只是没有解析它们。因此,在XmlSlurper完成它之后查看XML会使一切看起来都正确。