2017-02-24 32 views
0

GPATH表達:使用變量考慮下面的XML文檔中的XmlSlurper

<root> 
    <Person> 
    <Name>JOHN DOE</Name> 
    </Person> 
</root> 

隨着Groovy腳本我解析文檔是這樣的:

def xmlFile = new File("mydocument.xml") 
def root = new XmlSlurper().parse(xmlFile) 
println(root.Person.Name) 

是否有可能使GPATH表達變量所以它會喜歡這樣的東西?

def xmlFile = new File("mydocument.xml") 
def root = new XmlSlurper().parse(xmlFile) 
def gpathExpr = "root.Person.Name" 
println(gpathExpr) // <-- Evaluate this during runtime 
+0

我也看到了這篇文章並引用它,但還有另一種解決方案使用'Eval'來實際評估GPath表達式。 – Andy

回答

1

這裏有兩個工作解決方案(以JUnit Groovy測試的形式)。前者來源於this answer;後者是我自己試驗並發現的。我認爲後者與你所尋找的內容更接近,但前者可能更強大。

附註:我不知道你是怎麼打算在「變量路徑」表達閱讀,但是你應該非常小心,因爲你做徹底清理它不想上運行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" 
}