在XmlSlurper中将变量用作GPath表达式

在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

给定以下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.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"
}