我正在使用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"/>
作为一个元素。这对我没有多大好处,因为这是我首先要避免的。
非常感谢任何帮助。看起来它在空元素上窒息但我不明白为什么会这样。
答案 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 元素是可访问的。