Groovy создает или преобразовывает XML для динамической вложенной структуры с помощью Closure - PullRequest
0 голосов
/ 28 августа 2018

у меня есть XML

<root>
    <item>
        <path>/Apple/Banana/Cherry/</path>
        <field>A</field>
        <value>1</value>
    </item>
    <item>
        <path>/Apple/Banana/Cherry/</path>
        <field>B</field>
        <value>2</value>
    </item>
    <item>
        <path>/Apple[1]/Banana/Cherry/</path>
        <field>C</field>
        <value>3</value>
    </item>
</root>

и ожидаемый результат должен быть

<root>
    <Apple>
        <Banana>
            <Cherry>
                <A>1</A>
                <B>2</B>
            </Cherry>
        </Banana>
    </Apple>
    <Apple>
        <Banana>
            <Cherry>
                <C>3</C>
            </Cherry>
        </Banana>
    </Apple>
</root>

Я реализую функцию преобразования через Groovy,

def writer = new StringWriter()
def parser = new XmlParser()
def items  = parser.parseText(test).item

def completePath
def value

new MarkupBuilder(writer).with { xmlFile ->
    root() {
        items.each { node ->
            completePath = node.path.text() + node.field.text()
            completePath = completePath.substring(1) //remove "/"
            value = node.value.text()
            def spliter = completePath.split("/")
            spliter.reverse().inject(null){ ret, next ->
                if (ret)
                {
                    { x-> xmlFile."$next"(ret)}
                }
                else
                {
                    { x-> xmlFile."$next"(value)}
                }
            }()
        }
    }
}

println writer.toString()

Здесь используются reverse и inject для динамического создания вложенной структуры, но конечный результат равен Error, что

<root>
  <Apple>
    <Banana>
      <Cherry>
        <A>1</A>
      </Cherry>
    </Banana>
  </Apple>
  <Apple>
    <Banana>
      <Cherry>
        <B>2</B>
      </Cherry>
    </Banana>
  </Apple>
  <Apple[1]>
    <Banana>
      <Cherry>
        <C>3</C>
      </Cherry>
    </Banana>
  </Apple[1]>
</root>

Вопросы, 1. как можно создать структуру гнезда? 2. Я не обработал повторяющуюся часть, которая заканчивается [index]. В закрытии как это можно обработать?

Любое предложение или помощь, я очень признателен за любую помощь !!

...