在根元素中未指定名称空间时,在Groovy中解析名称空间?

时间:2013-10-04 20:01:50

标签: xml groovy xml-parsing xml-namespaces

我正在编写一个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")。

1 个答案:

答案 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'