2012-06-10 68 views
1

我使用XmlSlurper解析一段XML,需要找到一個xml元素值。 這裏面臨的挑戰是,我不能確定xml文檔中的外殼是否正確,因此我需要以任何可能的方式查找元素。使用XmlSlurper/GPath查找xml元素值不區分大小寫?

例子:

<start> 
    <Header> 
     <Elem>1234</Elem> 
    </Header> 
</start> 

獲取ELEM的價值將是:

def parsedXml = new XmlSlurper().parseText(xml) 
parsedXml.Header.Elem 

,但我還需要找到它時,外殼是不同的..所以有一個辦法我可以通過表達來發現套管不同時Elem的價值?

<start> 
    <header> 
     <elem>1234</elem> 
    </header> 
</start> 

def parsedXml = new XmlSlurper().parseText(xml) 
parsedXml.header.elem 

回答

2

有可能是一個更好的解決方案(例如,似乎使用XPath它應該可以compare node names case insensitively),但轉換文檔爲小寫會工作。如果你關心的文檔中的文本節點的外殼,你可能只轉換爲小寫的標籤元素:

def toLowerCaseXmlTags(xmlText) { 
    xmlText.replaceAll(/<[^<>]+>/) { it.toLowerCase() } 
} 

text = """ 
<start> 
    <Header> 
     <Elem>1234</Elem> 
     <SomeText>This should PRESERVE casing</SomeText> 
    </Header> 
</start> 
""" 

def xml = new XmlSlurper().parseText(toLowerCaseXmlTags(text)) 
assert xml.header.elem.text() == '1234' 
assert xml.header.sometext.text() == 'This should PRESERVE casing' 

快速和骯髒的,但它的工作原理:P

2

XML是大小寫敏感的,所以是XmlSlurper結果的屬性查找。您將需要使用GPathResult.find()方法:

def header = parsedXml.find { it.name().toLowerCase() == 'header' } 
def elem = header.find { it.name().toLowerCase() == 'elem' } 

退房的groovy documentation你可以使用XmlSlurped文件更多的途徑。

+1

你也可以通過'it.name()。equalsIgnoreCase('header')'直接做一個不區分大小寫的比較= D – epidemian