groovy を使用して xml を JSON に変換したいと考えています。変換の詳細は私の好みに依存することは理解していますが、使用する必要があるライブラリとメソッドを推奨し、それらを使用する理由/方法について少し情報を提供してもらえますか? groovy は非常に効果的なパーサーであると言われて使用しているので、これを利用するライブラリを探しています。
ありがとう!
基本的な Groovy ですべて実行できます。
// Given an XML string
def xml = '''<root>
| <node>Tim</node>
| <node>Tom</node>
|</root>'''.stripMargin()
// Parse it
def parsed = new XmlParser().parseText( xml )
// Convert it to a Map containing a List of Maps
def jsonObject = [ root: parsed.node.collect {
[ node: it.text() ]
} ]
// And dump it as Json
def json = new groovy.json.JsonBuilder( jsonObject )
// Check it's what we expected
assert json.toString() == '{"root":[{"node":"Tim"},{"node":"Tom"}]}'
ただし、特定のことについて本当に考える必要があります...
<node>text<another>woo</another>text</node>
スタイル マークアップが含まれますか? もしそうなら、あなたはそれをどのように処理しますか?2 つの間のスムーズな 1:1 マッピングではありません...しかし、XML の特定の形式については、Json の特定の特定の形式を考え出すことができる場合があります。
ドキュメントから名前を取得するには (コメントを参照)、次のようにします。
def jsonObject = [ (parsed.name()): parsed.collect {
[ (it.name()): it.text() ]
} ]
以下を使用して、より深い深度のサポートを追加できます。
// Given an XML string
def xml = '''<root>
| <node>Tim</node>
| <node>Tom</node>
| <node>
| <anotherNode>another</anotherNode>
| </node>
|</root>'''.stripMargin()
// Parse it
def parsed = new XmlParser().parseText( xml )
// Deal with each node:
def handle
handle = { node ->
if( node instanceof String ) {
node
}
else {
[ (node.name()): node.collect( handle ) ]
}
}
// Convert it to a Map containing a List of Maps
def jsonObject = [ (parsed.name()): parsed.collect { node ->
[ (node.name()): node.collect( handle ) ]
} ]
// And dump it as Json
def json = new groovy.json.JsonBuilder( jsonObject )
// Check it's what we expected
assert json.toString() == '{"root":[{"node":["Tim"]},{"node":["Tom"]},{"node":[{"anotherNode":["another"]}]}]}'
繰り返しますが、以前のすべての警告は依然として当てはまります (ただし、この時点で少し大きく聞こえるはずです) ;-)
少し遅れてしまいましたが、次のコードは XML を一貫性のある JSON 形式に変換します。
def toJsonBuilder(xml){
def pojo = build(new XmlParser().parseText(xml))
new groovy.json.JsonBuilder(pojo)
}
def build(node){
if (node instanceof String){
return // ignore strings...
}
def map = ['name': node.name()]
if (!node.attributes().isEmpty()) {
map.put('attributes', node.attributes().collectEntries{it})
}
if (!node.children().isEmpty() && !(node.children().get(0) instanceof String)) {
map.put('children', node.children().collect{build(it)}.findAll{it != null})
} else if (node.text() != ''){
map.put('value', node.text())
}
map
}
toJsonBuilder(xml1).toPrettyString()
XML を変換します...
<root>
<node>Tim</node>
<node>Tom</node>
</root>
の中へ...
{
"name": "root",
"children": [
{
"name": "node",
"value": "Tim"
},
{
"name": "node",
"value": "Tom"
}
]
}
フィードバック/改善を歓迎します!