1

我正在编写一个 Groovy 脚本来解析来自 Web 服务的 SOAP 响应,并且 XML 在文档中间指定了一个命名空间:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <AuthenticateResponse xmlns="KaseyaWS">
         <AuthenticateResult>
            <SessionID>xxxxxxxxxx</SessionID>
            <Method>Authenticate</Method>
            <TransactionID>4228</TransactionID>
            <ErrorMessage/>
            <ErrorLocation/>
         </AuthenticateResult>
      </AuthenticateResponse>
   </soap:Body>
</soap:Envelope>

命名空间没有指定名称,它只适用于<AuthenticateResponse xmlns="KaseyaWS">节点内的所有内容,但我仍然希望能够解析它。

从该方法返回的GPathResultparseText()允许您调用declareNameSpace(Map m)以将命名空间添加到文档,如下所示:

def slurper = XmlSlurper().parseText(someXMLText).declareNamespace(soap:'http://schemas.xmlsoap.org/soap/envelope/')

但我不明白如何调用GPathResultdeclareNamespace()来指定匿名命名空间()。xmlns="KaseyaWS"

4

1 回答 1

3

XmlSlurper可以不知道命名空间。所以你可以解析而不用担心命名空间:

def slurper = new XmlSlurper().parseText(someXMLText)
def result = slurper.Body.AuthenticateResponse.AuthenticateResult

assert result.SessionID == 'xxxxxxxxxx' 
assert result.Method == 'Authenticate' 
assert result.TransactionID == '4228' 

XmlParser如果您需要对命名空间和 xml 解析为 Node 的方式进行更多控制,则可以使用:

def soapNs = new groovy.xml.Namespace(
                    "http://schemas.xmlsoap.org/soap/envelope/", 'soap')
def ns = new groovy.xml.Namespace("KaseyaWS", "test") //Dummy NS Prefix
def parser = new XmlParser().parseText(someXMLText)

assert parser[soapNs.Body][ns.AuthenticateResponse]
                  .AuthenticateResult.SessionID.text() == 'xxxxxxxxxx'
assert parser[soapNs.Body][ns.AuthenticateResponse]
                  .AuthenticateResult.Method.text() == 'Authenticate'
于 2013-10-05T22:18:26.540 回答