簡體   English   中英

groovy xml解析功能

[英]groovy xml parsing function

我希望有一個Groovy函數,可以接受2個或多個參數,例如inputfind_tag

我寫了下面這樣的東西來測試(不起作用),但是它沒有給我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 "id = ${records.attribute("id")}"

但像明智的做法如何為節點呢?

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

如果您不知道要搜索的XML標記的確切路徑,則可以執行以下操作以獲取具有給定名稱的所有標記的內容:

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

要從給定的XML節點訪問屬性,您也可以使用@表示法,例如

records.vector.@objVersion

您需要做的是:

  • 關閉名稱空間意識,以便XmlParser在遇到未綁定的xsi:前綴時不會引發錯誤。 您可以通過將正確的參數傳遞給XmlParser構造函數來XmlParser
  • 正確遍歷解析器返回的DOM樹-它返回一個Node ,而不是一個列表,並且使用findAll所用的方式將不起作用
  • (可選)從XML中的雙引號之前刪除反斜杠,因為不必在Heredoc中轉義雙引號

更正后的代碼:

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',如預期的那樣。

我認為您必須在這里使用XPath表達式,或者如果您在有問題的顯示中准確輸入xml,我建議您像

def temp = ".." //your temp

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

有關groovy regexp的更多信息http://groovy.codehaus.org/Regular+Expressions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM