2011-10-31 96 views
0

我希望有這可能需要2個或多個參數類似inputfind_tag一個常規功能。常規XML解析功能

我寫的東西像下面的測試(沒有的功能),但它並沒有給我D_1164898448。請幫助我。

def temp="""<Portals objVersion=\"1.1.19\"> 
<vector xsi:type=\"domainservice:Portals\" objVersion=\"1.1.19\"> 
<domainName>D_1164898448</domainName> 
<address xsi:type=\"metadata:NodeRef\" objVersion=\"1.1.19\"> 
<host>Komodo</host> 
<port>18442</port> 
</address> 
</vector> 
</Portals>""" 

def fInput="domainName" 

def records = new XmlParser().parseText(temp) 
def t=records.findAll{ it.fInput}.text() 
println t 

更新

的屬性我正在幹什麼類似下面

​​

但像明智如何做到這一點的節點?

println "host = ${records.vector.address.host.text()}" 

回答

2

如果你不知道你正在尋找,你可以做這樣的事情讓所有標籤的給定名稱的內容的XML標籤的準確路徑:

def t = records."**"."$fInput".text() 

要從給定的XML節點訪問屬性也可以使用@符號,例如

[email protected] 
1

你需要做的是:

  • 關閉名稱空間意識,使XmlParser的不會在遇到綁定xsi:前綴拋出一個錯誤。您可以通過將正確的參數傳遞給XmlParser構造函數來完成。
  • 正確遍歷由分析器返回的DOM樹 - 它返回一個Node,而不是一個列表,並使用findAll你使用的方式是行不通的
  • (可選)從你的XML雙引號之前刪除反斜槓,作爲逃避雙一個定界符引號內是沒有必要的

你的更正後的代碼:

def temp=""" 
    <Portals objVersion="1.1.19"> 
     <vector xsi:type="domainservice:Portals" objVersion="1.1.19"> 
      <domainName>D_1164898448</domainName> 
      <address xsi:type="metadata:NodeRef" objVersion="1.1.19"> 
       <host>Komodo</host> 
       <port>18442</port> 
      </address> 
     </vector> 
    </Portals> 
""" 

def fInput="domainName" 

def records= new XmlParser(false, false).parseText(temp) 
def t = records.vector."$fInput".text() 
println t 

運行它會顯示 'D_1164898448',符合市場預期。

+0

有什麼類似'$ {records.attribute(「ID」)}「'拿到節點,其中代替'id'我可以給我的完整DOM樹路徑節點? – abi1964

+0

的XmlReader返回'groovy.util.Node',這是不一樣的DOM節點,所以不支持XPath表達式它能做什麼支持是GPATH表述,這裏所描述:http://groovy.codehaus.org/GPath。看看你能不能用這個如果沒有,你需要充分的XPath支持,你可能需要使用一個外部庫;看到http://groovy.codehaus.org/Reading+XML+with+Groovy+and+XPath – socha23

0

我想你一定在這裏使用XPath表達式,或者如果你輸入的XML excactly你有問題表明,我是正則表達式推薦給你喜歡

def temp = ".." //your temp 

def m = temp =~ /<domainName>(.*)</domainName>/ 
print m[0][1] // should be your domain 

更多關於Groovy的正則表達式http://groovy.codehaus.org/Regular+Expressions

+0

如何'(*)'解析?當我使用'調用println堂妹 「<$fInput>(。*)」'它只是給了我'(。*)' – abi1964

+0

對不起,我是想你熟悉Groovy Regexp。編輯更多解釋。 –

+1

@AlexeySviridov你建議使用Regexp解析XML?真? –