在XmlSlurper中将变量用作GPath表达式
给定以下XML文档:在XmlSlurper中将变量用作GPath表达式,xml,groovy,xmlslurper,Xml,Groovy,Xmlslurper,给定以下XML文档: <root> <Person> <Name>JOHN DOE</Name> </Person> </root> 是否可以将GPath表达式变量设置为如下所示 def xmlFile = new File("mydocument.xml") def root = new XmlSlurper().parse(xmlFile) def gpathExpr = "root.Person.Na
<root>
<Person>
<Name>JOHN DOE</Name>
</Person>
</root>
是否可以将GPath表达式变量设置为如下所示
def xmlFile = new File("mydocument.xml")
def root = new XmlSlurper().parse(xmlFile)
def gpathExpr = "root.Person.Name"
println(gpathExpr) // <-- Evaluate this during runtime
def xmlFile=新文件(“mydocument.xml”)
def root=new XmlSlurper().parse(xmlFile)
def gpathExpr=“root.Person.Name”
println(gpathExpr)//这里有两种工作解决方案(以JUnit Groovy测试的形式)。前者来源于;后者是我自己试验发现的。我认为后者更符合您所寻找的,但前者可能更强大
旁注:我不知道您打算如何读取“变量路径”表达式,但您应该非常小心地对其进行彻底清理,因为您不想对任意、未初始化、用户提供的输入运行Eval.me()
@Test
void testShouldUseVariableGPathExpression() {
// Arrange
def xmlContent = """<root>
<Person>
<Name>JOHN DOE</Name>
</Person>
</root>"""
def getNodes = { doc, path ->
def nodes = doc
path.split("\\.").each { nodes = nodes."${it}" }
return nodes
}
def root = new XmlSlurper().parseText(xmlContent)
// Don't reference 'root' here
def path = "Person.Name"
// Act
def personName = getNodes(root, path)
logger.info("Parsed ${path}: ${personName}")
// Assert
assert personName == "JOHN DOE"
}
@Test
void testShouldUseVariableGPathExpressionAndEval() {
// Arrange
def xmlContent = """<root>
<Person>
<Name>JOHN DOE</Name>
</Person>
</root>"""
def root = new XmlSlurper().parseText(xmlContent)
def path = "root.Person.Name"
def expression = "evaluatedPath = ${path}"
logger.info("Generated expression: ${expression}")
// Act
def evaluatedPath = Eval.me('root', root, path)
logger.info("Evaluated result: ${evaluatedPath}")
def personName = evaluatedPath
logger.info("Parsed ${path}: ${personName}")
// Assert
assert personName == "JOHN DOE"
}
@测试
void test应使用variablegpathexpression(){
//安排
def xmlContent=“”
无名氏
"""
def getNodes={doc,path->
def nodes=doc
path.split(“\\.”)。每个{nodes=节点。${it}
返回节点
}
def root=new XmlSlurper().parseText(xmlContent)
//不要在此处引用“根”
def path=“Person.Name”
//表演
def personName=getNodes(根,路径)
info(“解析的${path}:${personName}”)
//断言
assert personName==“JOHN DOE”
}
@试验
void测试应使用variablegpathexpressionandevel(){
//安排
def xmlContent=“”
无名氏
"""
def root=new XmlSlurper().parseText(xmlContent)
def path=“root.Person.Name”
def expression=“evaluatedPath=${path}”
info(“生成的表达式:${expression}”)
//表演
def evaluatedPath=Eval.me('root',root,path)
info(“评估结果:${evaluatedPath}”)
def personName=evaluatedPath
info(“解析的${path}:${personName}”)
//断言
assert personName==“JOHN DOE”
}
我也看到了这篇文章并引用了它,但还有另一个解决方案使用Eval
来实际计算GPath表达式。
@Test
void testShouldUseVariableGPathExpression() {
// Arrange
def xmlContent = """<root>
<Person>
<Name>JOHN DOE</Name>
</Person>
</root>"""
def getNodes = { doc, path ->
def nodes = doc
path.split("\\.").each { nodes = nodes."${it}" }
return nodes
}
def root = new XmlSlurper().parseText(xmlContent)
// Don't reference 'root' here
def path = "Person.Name"
// Act
def personName = getNodes(root, path)
logger.info("Parsed ${path}: ${personName}")
// Assert
assert personName == "JOHN DOE"
}
@Test
void testShouldUseVariableGPathExpressionAndEval() {
// Arrange
def xmlContent = """<root>
<Person>
<Name>JOHN DOE</Name>
</Person>
</root>"""
def root = new XmlSlurper().parseText(xmlContent)
def path = "root.Person.Name"
def expression = "evaluatedPath = ${path}"
logger.info("Generated expression: ${expression}")
// Act
def evaluatedPath = Eval.me('root', root, path)
logger.info("Evaluated result: ${evaluatedPath}")
def personName = evaluatedPath
logger.info("Parsed ${path}: ${personName}")
// Assert
assert personName == "JOHN DOE"
}