当我使用插值字符串创建子节点时,我无法使用点表示法再次访问该节点。当我尝试访问相关节点时,我得到null
。如果我循环遍历children()
并寻找它,我可以得到节点,但我不应该这样做。以下代码重复了该问题:
// All works as expected when an interpolated string isn't used to create the child node
def rootNode = new Node(null, "root")
def childNode = new Node(rootNode, "child", [attr: "test"])
def childNodeCopy = rootNode.child[0]
println childNode.toString() // child[attributes={attr=test}; value=[]]
println childNodeCopy.toString() // child[attributes={attr=test}; value=[]]
println childNode.toString() == childNodeCopy.toString() // true
// But when an interpolated string is used the child node cannot be accessed from the root
rootNode = new Node(null, "root")
def childName = "child"
childNode = new Node(rootNode, "$childName", [attr: "test"])
childNodeCopy = rootNode.child[0]
println childNode.toString() // child[attributes={attr=test}; value=[]]
println childNodeCopy.toString() // null
println childNode.toString() == childNodeCopy.toString() // false
答案 0 :(得分:1)
啊,这是因为在内部, 实际上,它只是遍历节点的名称,但是在Java中,它不会找到孩子,因为Node
必须将节点名称存储为映射中的键string.equals( groovyString )
永远不会是真的
由于Groovy字符串不是字符串,rootNode.child
正在返回null
作为解决方法,您可以执行以下操作:
childNode = new Node(rootNode, "$childName".toString(), [attr: "test"])
childNodeCopy = rootNode.child[0]