2014-06-25 63 views
2

我無法從某些屬性獲取值。 下面是XML: -使用Groovy的XmlParser解析屬性值

def temp=""" 
<nodemetadata> 
    <imx:IMX xmlns:imx="http://com.abc.imx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-  instance" xmlns:domainservice="http://com.abc.isp.metadata.domainservice/2"> 
    <domainservice:GatewayNodeConfig imx:id="U:pgwraGgJbC99YpLSQ" consolePort="13993" consoleShutdownPort="4613" domainName="D_1163931" nodeName="N_1163931" dbConnectivity="ID_1"> 
    <address imx:id="ID_2" xsi:type="common:NodeAddress" host="beetle" httpPort="1391" port="1392"/> 
    <portals> 
    <NodeRef imx:id="ID_3" xsi:type="common:NodeRef" address="ID_2"  nodeName="N_1163931"/> 
    </portals> 
    </domainservice:GatewayNodeConfig> 
    <domainservice:DBConnectivity imx:id="ID_1"  dbEncryptedPassword="AfaFnEtrQkOKFTVBYIIQ%3D%3D" dbHost="forer" dbName="ORCL" dbPort="1521"  dbType="ORACLE" dbUsername="mka"/> 
    </imx:IMX> 
</nodemetadata> 
     """ 

def records = new XmlParser().parseText(temp) 
def id='imx:id' 
//Trying to get the value of imx:id from <domainservice:DBConnectivity > 
log.info "Host = "+records.'imx:IMX'.'domainservice:DBConnectivity'[0].attribute(id) 

也是我想知道如何得到這樣(的xmlns:XSI)任何標記值從線 -

感謝以下。

+0

感謝你的回答,如果我想改變地址標記中'xsi:type'的值。我怎樣才能做到這一點。 – user3774346

回答

3

如果創建一個合格的名稱來代表該屬性的關鍵,這將工作:

def records = new XmlParser().parseText(temp) 
def id = new groovy.xml.QName('http://com.abc.imx', 'id') 
println "Host = "+records.'imx:IMX'.'domainservice:DBConnectivity'[0].attribute(id) 

或者,你可以聲明解析器是不可識別名稱空間,並且在這種情況下,你可以這樣做這樣的:

def records = new XmlParser(false, false).parseText(temp) 
def id = 'imx:id' 
println "Host = "+records.'imx:IMX'.'domainservice:DBConnectivity'[0].attribute(id) 
+0

感謝你的回答,如果我想改變地址標記中'xsi:type'的值。我怎樣才能做到這一點。 – user3774346

-2

使用正則表達式查找表達式:

"your xml string".eachMatch(/<domainservice:GatewayNodeConfig imx:id="([^"]+)"/){ println it[ 1 ] } 

,如果你需要得到ID的價值只。它比XML解析更好地執行。

+0

這看起來相當隨意,並且打印出所有元素的ID,而不僅僅是OP希望選擇的ID。 –

+0

修正了正則表達式:) – injecteer

+2

爲什麼在提供工作解析器時使用regexp? –