我正在编写一个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">
节点中的所有内容,但我仍然希望能够解析它。
从parseText()
方法返回的GPathResult允许您调用declareNameSpace(Map m)
为文档添加命名空间,如下所示:
def slurper = XmlSlurper().parseText(someXMLText).declareNamespace(soap:'http://schemas.xmlsoap.org/soap/envelope/')
但我不理解如何在GPathResult上调用declareNamespace()
来指定匿名命名空间(xmlns="KaseyaWS"
)。
答案 0 :(得分: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'
如果您需要更多地控制命名空间以及将xml解析为Node的方式,则可以使用XmlParser
:
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'