【问题标题】:Finding xml element value case insensitive using XmlSlurper/GPath?使用 XmlSlurper/GPath 查找不区分大小写的 xml 元素值?
【发布时间】:2012-06-10 20:31:05
【问题描述】:

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

【问题讨论】:

    标签: xml grails groovy xmlslurper gpath


    【解决方案1】:

    可能有一个更好的解决方案(例如,使用 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 文档的方法。

      【讨论】:

      • 也可以直接it.name().equalsIgnoreCase('header')做不区分大小写的比较=D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      相关资源
      最近更新 更多