我正在编写一个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">节点中的所有内容,但我仍然希望能够解析它。
从GPathResult方法返回的parseText()允许您调用declareNameSpace(Map m)向文档添加命名空间,如下所示:
def slurper = XmlSlurper().parseText(someXMLText).declareNamespace(soap:'http://schemas.xmlsoap.org/soap/envelope/')但是,我不明白如何在declareNamespace()上调用GPathResult来指定匿名命名空间(xmlns="KaseyaWS")。
发布于 2013-10-05 22:18:26
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'https://stackoverflow.com/questions/19189789
复制相似问题