如何根据地图中的名称缩短XML标记寻址?

时间:2017-07-13 10:24:34

标签: xml groovy xml-parsing

我正在编写一个从某些XML创建文件的函数。根据参数dataSort,可以将不同的标记作为源数据。这是一个小例子代码,如果有效,则输出“Success”。它在这个变种中。使用此代码进行测试。

abstract class MessageData {
    static enum DataSort{REQUEST,RESPONSE}
    static Map<DataSort,String> xmlTag = [REQUEST:'input_parameters', RESPONSE:'output_parameters']

    static void exportSimulator(){
        DataSort dataSort= DataSort.REQUEST
        Node rootNode = new XmlParser().parseText(
"""     
<root>
    <api> 
        <input_parameters> 
            Success
        </input_parameters>
    </api>
</root>
""")
        String tag = xmlTag["$dataSort"]
        def field = rootNode.api."$tag"
        println field.text()
    }
}

我想把最后两行写成一个。如果我写的话 "$xmlTag["$dataSort"]"
第一次解析后的Groovy将其解释为"$xmlTag[REQUEST]",此地图地址将找到null,结果为空。如果我写的话 "$xmlTag[$dataSort]"
我真的不知道它将如何被解析,但它也给了null

我可以直接从地图上获取变量标签吗?

顺便说一句,对于有关Groovy解析的更好来源的任何建议,我将不胜感激。

编辑:

以下仅供正确搜索:

问题不在于解析,而是在

通过枚举常量

启动坏地图

1 个答案:

答案 0 :(得分:2)

我相信您可以这样做,但必须在import { CLIENT_EVENTS: { RTM: RTM_CLIENT_EVENTS }, } from '@slack/client'; 之间使用它,如下所示:

"${..}"

以下是整个脚本,可以在适用的情况下在线测试独立和评论:

rootNode.api."${xmlTag[dataSort]}"

您可以在线快速尝试 Demo

以下两个陈述产生相同的结果:

enum DataSort{REQUEST,RESPONSE}
//Need to use key in between (..) as REQUEST, RESPONSE are not string literals in here
Map<DataSort,String> xmlTag = [(DataSort.REQUEST):'input_parameters', (DataSort.RESPONSE):'output_parameters']

def exportSimulator = { 
        DataSort dataSort= DataSort.REQUEST
        //Used slurper
        def rootNode = new XmlSlurper().parseText(
"""     
<root>
    <api> 
        <input_parameters> 
            Success
        </input_parameters>
    </api>
</root>
""")
        //Here is the main change that you are interested in
        def field = rootNode.api."${xmlTag[dataSort]}"
        println field.text().trim()
}
​exportSimulator()​