Поиск значения элемента xml без учета регистра с помощью XmlSlurper/GPath?

Я анализирую часть XML, используя XmlSlurper, и мне нужно найти значение элементов xml. Проблема в том, что я не всегда уверен, что регистр в 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

person Marco    schedule 10.06.2012    source источник


Ответы (2)


Вероятно, существует гораздо лучшее решение (например, кажется, что с помощью XPath должно быть возможно сравнение имен узлов без учета регистра), но преобразование документа в нижний регистр будет работать. Если вы заботитесь о регистре текстовых узлов внутри документа, вы можете преобразовать в нижний регистр только элементы тега:

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

person epidemian    schedule 10.06.2012

XML чувствителен к регистру, как и поиск свойств результатов XmlSlurper. Вам нужно будет использовать GPathResult.find() метод:

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

Ознакомьтесь с документацией по Groovy, чтобы узнать о других способах использования документов XmlSlurped. .

person krock    schedule 10.06.2012
comment
Вы также можете сделать it.name().equalsIgnoreCase('header'), чтобы сделать сравнение без учета регистра напрямую =D - person epidemian; 11.06.2012