使用XmlSlurper / GPath查找xml元素值不区分大小写?

时间:2012-06-10 20:31:05

标签: xml grails groovy xmlslurper gpath

我正在使用XmlSlurper解析一段XML,需要找到一个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

XML区分大小写,XmlSlurper结果的属性查找也是如此。您需要使用GPathResult.find()方法:

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

查看groovy documentation了解更多可以使用XmlSlurped文档的方法。