Для петли в Groovy для строки с конкатенацией

У меня есть строка как 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 для цикла что-то вроде ниже. Я верю, что пытаюсь сделать это немного сложнее. Есть ли какой-нибудь простой способ создать XML выше, используя Groovy?

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()

2 ответа

Решение

Этот способ (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>

Я бы сделал что-то вроде

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

Другие вопросы по тегам