для цикла в 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()

person Simbu    schedule 03.06.2016    source источник


Ответы (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>
person dmahapatro    schedule 03.06.2016

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

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

person MayTheSchwartzBeWithYou    schedule 03.06.2016
comment
Спасибо за ваш ответ. Я новичок в groovy script. Я получил ошибку компиляции, как показано ниже. Script8.groovy: 12: unexpected token: def @ line 12, column 5. for(def kv of values) { - person Simbu; 03.06.2016
comment
Кажется, groovy не позволяет мне использовать def внутри скобок цикла. - person Simbu; 03.06.2016
comment
@Simbu, да, извините, я просто кодировал JS и Python в течение 8 часов и все смешал. Попробуйте for (kv in values) - person MayTheSchwartzBeWithYou; 03.06.2016
comment
Решение @Simbu @nathan-hughes довольно классное. Подробнее о сборе записей читайте здесь docs.groovy-lang.org/latest/html/groovy-jdk/java/util/, groovy.lang.Closure) Это похоже на map - person MayTheSchwartzBeWithYou; 03.06.2016