改变groovy版本会使我的xml slurping在xml:lang上失败

时间:2014-08-27 23:35:11

标签: xml groovy xml-parsing xml-namespaces xmlslurper

在我的xml文件中,我使用

从URL读取
def inp = url.openStream(...)
def slurper = new XmlSlurper()
def xml = slurper.parse(inp).declareNamespace(xml:'http://www.w3.org/XML/1998/namespace')

我有

<course xmlns="http://www.kth.se/student/kurser" code="DD2471">
  <title xmlns="" xml:lang="sv">Moderna databassystem</title>
  <title xmlns="" xml:lang="en">Modern Database Systems</title>

我用groovy 1.8.6提取标题

def name = xml.title.find{ it.@':lang' == 'sv' }.text()

但是当升级到groovy 2.2.2时,我不再将瑞典标题变成一个空字符串,我无法弄清楚如何提取标题。 我想找到一个适用于所有groovy版本(或&gt; = 1.8.6)

的方法

2 个答案:

答案 0 :(得分:3)

适用于 2.2.2 2.3.4 - 2.2.2 ,因为那里访问xml NS时<{3}}。

xml.title.find{ it.'@xml:lang'=='sv' }.text()

':lang'(没有NS前缀)表示(在较新的groovy版本中) no namespace

请参阅bug

  
      
  • 姓名或&#34; *:姓名&#34;匹配一个名为&#34; name&#34;的元素。不论其所在的命名空间(即这是默认的操作模式)
  •   
  • &#34;:名称&#34;匹配一个名为&#34; name&#34;的元素。只有id元素不在命名空间中
  •   
  • &#34;前缀:名称&#34;匹配元素名称&#34; name&#34;只有当它位于由前缀&#34;前缀&#34;标识的命名空间中时(以及命名空间映射的前缀由之前对declareNamespace的调用定义)
  •   

答案 1 :(得分:0)

问题是我遇到了我在我的应用程序中使用的groovy版本(2.2.2。)中的一个错误,唯一合理的结论是升级到错误更正的版本。 因此,解决方案是升级到最新的groovy(2.3.6)和grails(2.4.3)

另一种解决方案是使用XmlParser而不是XmlSlurper,这是我目前使用的。

我还必须从JDBC3升级到JDBC4。

最后,当公司从Ubuntu 12.04迁移到Ubuntu 14.04时,我将升级到Postgresql 9.3.5

所有这些升级都已计划最终发生,但是常规错误迫使我们加快步伐,我们采取了更长的步骤,跳过som中间版本。