从 Linkedhash 映射创建一个 Xml

问题描述 投票:0回答:1

我们有要求从这个 LinkeedhashMap 中我们需要创建一个 XMl

[类型:[eq '02',eq '01'],值:[eq '22'],(日期:[ge datetime'2023-02-28T00:00:00'],日期:[le datetime' 2023-03-01T00:00:00')]]

预期产出:

<filter>
    <expression>
        <leftOperand>Type</leftOperand>
        <operator>eq</operator>
        <rightOperand>02</rightOperand>
    </expression>
    <expression>
        <leftOperand>Type</leftOperand>
        <operator>eq</operator>
        <rightOperand>01</rightOperand>
    </expression>
    <expression>
        <leftOperand>Value</leftOperand>
        <operator>eq</operator>
        <rightOperand>22</rightOperand>
    </expression>
    <expression>
        <leftOperand>Date</leftOperand>
        <operator>ge</operator>
        <rightOperand>2023-02-28T00:00</rightOperand>
    </expression>
    <expression>
        <leftOperand>Date</leftOperand>
        <operator>le</operator>
        <rightOperand>2023-03-01T00:00</rightOperand>
    </expression>
</filter>

通过XSLT或者Groovy脚本来实现?

xslt groovy linkedhashmap
1个回答
0
投票

我只能提供 Groovy 支持。我不完全清楚你的地图中的数据类型是什么,但如果你的地图是这样的:

Map map = [Type: ["eq '02'", "eq '01'"], Value: ["eq '22'"], Date: ["ge datetime'2023-02-28T00:00:00'"], Date: ["le datetime'2023-03-01T00:00:00'"]]

您可以使用 Groovy 的 StreamingMarkupBuilder 像这样创建您的 XML:

import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil

def xmlBuilder = new StreamingMarkupBuilder()
def writer = xmlBuilder.bind {
    filter {
        map.each { left, ops ->
            ops.each {
                def (op, right) = it.split()
                expression {
                    leftOperand left
                    operator op
                    rightOperand((right =~ /'(.*)'/)[0][1])
                }
            }
        }
    }
}
println(XmlUtil.serialize(writer.toString()))
© www.soinside.com 2019 - 2024. All rights reserved.