2012-06-10 5 views
1

Я разбираю часть XML с помощью XmlSlurper и должен найти значение xml-элементов. Задача в том, что я не всегда уверен, что оболочка в XML-документе будет правильной, поэтому мне нужно найти элемент любым возможным способом.Поиск значения элемента xml без учета регистра с помощью XmlSlurper/GPath?

Пример:

<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