for loop in groovy for string with concatenation

for loop in groovy for string with concatenation

我有像 Color=Blue|Size=M|Style=simpleStyle 这样的字符串,需要使用 groovy.

如下所示进行转换
<Item>
      <comp>
        <name>Color</name>
        <value>Blue</value>
      </comp>
      <comp>
        <name>Size</name>
        <value>M</value>
      </comp>
      <comp>
        <name>Style</name>
        <value>simpleStyle</value>
      </comp>
</Item>

我写了 groovy for 循环,如下所示。我相信我正在以更难的方式尝试它。有什么简单的方法可以使用 Groovy 生成 XML 以上的内容吗?

for (int i = 0; StrRelationshipDetails.toString().contains('|'); i++) {
    println StrRelationshipDetails.toString()

    def StrPair = new StringBuilder(StrRelationshipDetails.substring(0, StrRelationshipDetails.indexOf('|')))
    def StrName = new StringBuilder(StrPair.substring(0, StrPair.indexOf('=')))
    def StrValue = new StringBuilder(StrPair.substring(StrPair.indexOf('=')+1, StrPair.size()))

    StrRelationshipDetails = StrRelationshipDetails.substring(StrRelationshipDetails.indexOf('|')+1, StrRelationshipDetails.size())
}
    println StrRelationshipDetails.toString()

我会做类似

def result = "<Item>"
def values = StrRelationshipDetails.toString().tokenize("|")
for(def kv of values) {
    result +="<comp>"
    def pair = kv.tokenize("=")
    def name = pair[0]
    def value= pair[1]
    result += "<name>$name</name>" 
    result += "<value>$value</value>" 
    result +="</comp>"
}
result +="</Item>"

然后我会使用 XMLSlurper 将其制作成 XML 文档。

有一点需要注意。上面的代码非常具有描述性,可以使事情更清楚。它可以更短(尤其是 Groovy)。您还可以将 def 变量定义为 String

这种方式(一个 Groovy 方式)应该可以在不使用 for 循环的情况下工作:

String provided = "Color=Blue|Size=M|Style=simpleStyle"

def builder = new groovy.xml.MarkupBuilder()

builder.Item {
    provided.tokenize('|')*.tokenize('=').each { element ->
        comp {
            name element[0]
            value element[1]
        }
    }
}

return

结果

<Item>
  <comp>
    <name>Color</name>
    <value>Blue</value>
  </comp>
  <comp>
    <name>Size</name>
    <value>M</value>
  </comp>
  <comp>
    <name>Style</name>
    <value>simpleStyle</value>
  </comp>
</Item>