у меня есть 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]. В закрытии как это можно обработать?
Любое предложение или помощь, я очень признателен за любую помощь !!