11

groovy を使用して xml を JSON に変換したいと考えています。変換の詳細は私の好みに依存することは理解していますが、使用する必要があるライブラリとメソッドを推奨し、それらを使用する理由/方法について少し情報を提供してもらえますか? groovy は非常に効果的なパーサーであると言われて使用しているので、これを利用するライブラリを探しています。

ありがとう!

4

4 に答える 4

10

基本的な 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"}]}'

ただし、特定のことについて本当に考える必要があります...

  • 属性をどのように表現しますか?
  • XML に<node>text<another>woo</another>text</node>スタイル マークアップが含まれますか? もしそうなら、あなたはそれをどのように処理しますか?
  • CDATA? コメント? 等?

2 つの間のスムーズな 1:1 マッピングではありません...しかし、XML の特定の形式については、Json の特定の特定の形式を考え出すことができる場合があります。

アップデート:

ドキュメントから名前を取得するには (コメントを参照)、次のようにします。

def jsonObject = [ (parsed.name()): parsed.collect {
  [ (it.name()): it.text() ]
} ]

更新 2

以下を使用して、より深い深度のサポートを追加できます。

// 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"]}]}]}'

繰り返しますが、以前のすべての警告は依然として当てはまります (ただし、この時点で少し大きく聞こえるはずです) ;-)

于 2013-09-16T14:21:29.980 に答える
5

少し遅れてしまいましたが、次のコードは 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"
        }
    ]
}

フィードバック/改善を歓迎します!

于 2014-07-09T07:12:11.217 に答える