1

我正在使用 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
4

2 回答 2

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

于 2012-06-10T21:34:44.870 回答
2

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

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

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

于 2012-06-10T21:51:34.243 回答