我使用以下代码获取xml请求标记的Child节点。但是node1和node2都给出了相同的结果。我不明白为什么。
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def holder = groovyUtils.getXmlHolder("StepName#Request")
def node1 = holder.getDomNode("//*:SomeTag").getChildNodes().toString()
def node2 = holder.getDomNode("//*:SomeTag").toString()
log.info node1==node2 //retuns true
答案 0 :(得分:1)
toString()
表示都返回相同的但是这并不意味着两个函数返回相同的情况。但是在这种情况下你是对的,两个对象看起来都是平等的,我试着解释一下:
XmlHolder.getDomNode()
返回一个对象实例
org.w3c.dom.Node
界面。 Node.getChildNodes()
返回org.w3c.dom.NodeList
接口的实例,其中包含此节点中包含的节点列表。
正如您在上面的API链接中看到的那样,两个方法最初似乎返回实现不同接口的对象,但是在此上下文执行中,两个对象都是:org.apache.xmlbeans.impl.store.Xobj$ElementXobj
的实例,是的,它们是等于的。
def xml = '''<root>
<SomeTag><myTag>a</myTag><myTag>b</myTag></SomeTag>
</root>
'''
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def holder = groovyUtils.getXmlHolder(xml)
def node1 = holder.getDomNode("//*:SomeTag").getChildNodes()
def node2 = holder.getDomNode("//*:SomeTag")
log.info (node1.getClass().getName()) // prints org.apache.xmlbeans.impl.store.Xobj$ElementXobj
log.info (node2.getClass().getName()) // prints org.apache.xmlbeans.impl.store.Xobj$ElementXobj
log.info node1.equals(node2) // true
请注意,这取决于运行此代码的上下文(类路径上还有其他库实现等),这两个对象可能不相等。
当您评论是否只想使用子节点时,您可以使用例如each
在这两种对象中迭代:
def xml = '''<root>
<SomeTag><myTag>a</myTag><myTag>b</myTag></SomeTag>
</root>
'''
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def holder = groovyUtils.getXmlHolder(xml)
def node1 = holder.getDomNode("//*:SomeTag").getChildNodes()
def node2 = holder.getDomNode("//*:SomeTag")
node1.each{
log.info it.toString()
}
node2.each{
log.info it.toString()
}
此代码记录:
// node 1 each
Wed Oct 07 21:26:07 CEST 2015:INFO:<?xml version="1.0" encoding="UTF-8"?>
<myTag>a</myTag>
Wed Oct 07 21:26:07 CEST 2015:INFO:<?xml version="1.0" encoding="UTF-8"?>
<myTag>b</myTag>
// node 2 each
Wed Oct 07 21:26:07 CEST 2015:INFO:<?xml version="1.0" encoding="UTF-8"?>
<myTag>a</myTag>
Wed Oct 07 21:26:07 CEST 2015:INFO:<?xml version="1.0" encoding="UTF-8"?>
<myTag>b</myTag>
希望它有所帮助,