Groovy: вложенный XML для Json - PullRequest
1 голос
/ 08 марта 2019

Я новичок в заводной.У меня проблема с моим требованием.

Мое требование - преобразовать вложенный XML в Json

Ниже приведен файл ввода:

<root>
    <Account>
        <name>name</name>
        <age>age</age>
    </Account>
    <Assets>
        <record>
            <info>info</info>
            <details>details</details>
            <attributes>
                <property>property</property>
            </attributes>
        </record>
        <record>
            <info>info 1</info>
            <details>details 1</details>
            <attributes>
                <property>property 1</property>
            </attributes>
        </record>
    </Assets>
</root>

Предпочтительным будет выводкак показано ниже:

{
 "root":[
 {"account":
 "records":{
 {"name":"name","age":"age"}
}
},
{"assets":
"records":{
"info":"info","details":"details"
},
{"attributes":{"property":"property"}}
,
{
"info":"info 1","details 1":"details 1"
},
{"attributes":{"property":"property 1"}}
}
]
}    

В сегменте Assets мы получим n количество записей, все данные записей должны быть заполнены внутри "record":{}.

Есть ли способ добиться этого?

Любые ваши отзывы будут высоко оценены

1 Ответ

0 голосов
/ 09 марта 2019

Обновленный код:

import groovy.json.JsonBuilder
def text = '''
<root>
    <Account>
        <name>name</name>
        <age>age</age>
    </Account>
    <Assets>
        <record>
            <info>info</info>
            <details>details</details>
            <attributes>
                <property>property</property>
            </attributes>
        </record>
        <record>
            <info>info 1</info>
            <details>details 1</details>
            <attributes>
                <property>property 1</property>
            </attributes>
        </record>
    </Assets>
</root>
'''

def toJsonBuilder(xml){
    new groovy.json.JsonBuilder(build(new XmlParser().parseText(xml)))
}
def build(node){
    if (node instanceof String)
        return 
    def map = [ "${node.name()}" : '' ]
    if (!node.children().isEmpty() && !(node.children().get(0) instanceof String)) { 
        map.put("${node.name()}", node.children().collect{build(it)}.findAll{it != null})
    } else if (node.text() != ''){
        map.put("${node.name()}", node.text())
    }
    map
}
println toJsonBuilder(text).toPrettyString()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...