Groovy的xml查找似乎在空元素

时间:2015-09-02 15:25:31

标签: xml groovy

我正在使用groovy的xml find方法运行。我必须说,在前面,这是我的第一个groovy脚本,我并没有完全处理XML。

以下是问题的摘要,下面是一个更具体的例子:

我正在尝试为我们的一个系统编写一些冒烟测试。作为其中的一部分,我必须比较XML文档(预期与实际)。 XML中元素的排序是非确定性的,负责这个的软件是我无法触及的,所以我必须解决它。没什么大不了的,我想从XML中拉出子节点并将它们相互比较。我想看的部分XML有很多空元素,我想分开考虑。出于某种原因,当我使用groovy XML find方法时,它将所有空元素组合在一起作为一个结果,而不是(在这种情况下)7个单独的结果。由于这些元素的排序是可变的,我的测试正在崩溃。这对我没有好处。

实施例<!/ P>

因此。这是xml文档的片段。这是给我带来麻烦的特殊部分(我必须做一些find-replace来匿名化):

<d_sorted>
              <comparator class="comparatorClass"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[7]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[2]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[3]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[4]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[5]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[6]/someTag"/>
   </d_sorted>

你将不得不在这里相信我,整个XML文档形成良好,没有什么奇怪的,但它太大了,不能只在这里复制粘贴,它有一些公司的东西。

这是我用来搜索它的常规电话:

expectedEntries = myXMLDocument.topLevelTag.'**'.findAll{it.someTag})

这是从那里回来的:

 <someTag reference="../../d_deltaMap/d_rep/entry[7]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[2]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[3]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[4]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[5]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[6]/someTag"/>

作为一个元素。这对我没有多大好处,因为这是我首先要避免的。

非常感谢任何帮助。看起来它在空元素上窒息但我不明白为什么会这样。

1 个答案:

答案 0 :(得分:0)

我不知道您正在使用哪个解析器,但XmlSlurper非常整洁!

def rootNode = new XmlSlurper().parseText(
    '''<d_sorted>
              <comparator class="comparatorClass"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[7]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[2]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[3]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[4]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[5]/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry/someTag"/>
              <someTag reference="../../d_deltaMap/d_rep/entry[6]/someTag"/>
   </d_sorted>''' )

assert rootNode.someTag*.@reference == [
    '../../d_deltaMap/d_rep/entry[7]/someTag', 
    '../../d_deltaMap/d_rep/entry[2]/someTag',
    '../../d_deltaMap/d_rep/entry[3]/someTag', 
    '../../d_deltaMap/d_rep/entry[4]/someTag', 
    '../../d_deltaMap/d_rep/entry[5]/someTag', 
    '../../d_deltaMap/d_rep/entry/someTag', 
    '../../d_deltaMap/d_rep/entry[6]/someTag'
]

// toString() is blank because there's no child text
assert rootNode.someTag[0] == ''

assert rootNode.someTag*.@reference.findAll { 
    it.@reference == '../../d_deltaMap/d_rep/entry[3]/someTag'
} == ['../../d_deltaMap/d_rep/entry[3]/someTag']

如您所见,assert语句显示 someTag 元素是可访问的。