2011-12-03 35 views
5

XMLの入力をJSONにオンザフライで変換する方法はありますか(可能であればJavaのコード例を使用)、実際の内容とXMLソースの構造ファイル、文字列など)?XMLからJSONへの動的変換

たとえば、大きなテキストファイルに格納されている未知の構造と複数のネストレベルを持つ非常に大きなXMLデータセットがあるとします。すべてをメモリに読み込むことはできません(空き容量がないため)。JSONに直接変換します。つまり、StAXタグを検出して処理するコードを書く必要はありません。

理想的な解決策は、例えば、一つのXMLファイルを供給し、Reader又はInputStreamJSONを生成し、たFileOutputStreamに供給され、あるいは直接にするように、変換器からReader又はInputStreamを取得するであろうJSONパーサーはJacksonです。それが不可能な場合は、少なくともXMLファイルを徐々に読み込み、JSONに変換して別のファイルに書き込むことは、許容できる妥協点です。 XML/JSON(例えば、StaxONJSON-libJettisonXStream)へ/から変換するために使用することができる

ツールはそれを行うように見えるが、公知の構造の変換のみありません。

EDIT:、OutputStreamのか(また、私は上記の話を聞いた、「変換」をカバーする)ライター、いくつかの方法で行うことができるからReaderまたはInputStreamを取得するものの、最良の結果を得るためにと「無限"入力サイズのマルチスレッド化が必要です。解決策は、article in Ostermiller.orgに記載されており、同様の実装がIO-Tools libraryに見られる。

答えて

5

ここには、Javaの組み込みStAX実装をparse XMLに、Jettisonをproduce JSONに移植した例があります。私はこのon Githubを実証する自己完結型のMavenプロジェクトを作成しました

import org.codehaus.jettison.mapped.MappedXMLOutputFactory; 

import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLEventWriter; 
import javax.xml.stream.XMLInputFactory; 
import java.io.StringReader; 
import java.util.HashMap; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     String xml = 
      "<root><foo>foo string</foo><bar><x>1</x><y>5</y></bar></root>"; 
     XMLEventReader reader = XMLInputFactory.newInstance() 
      .createXMLEventReader(new StringReader(xml)); 
     XMLEventWriter writer = new MappedXMLOutputFactory(new HashMap()) 
      .createXMLEventWriter(System.out); 
     writer.add(reader); 
     writer.close(); 
     reader.close(); 
    } 
} 

XMLEventWriterが、これは超シンプルな作り、作家を読者に橋渡しするための便利なadd(XMLEventWriter)方法があります。

+0

これは、「ファイルに書き込め」(または標準出力へ)ソリューションを提供します。答えと余計な努力をいただきありがとうございます! – PNS

+0

これでどのようにコメントタグを無視しますか? XMLEventWriterは、xmlにコメントタグがある場合に例外をスローします。 – ShaggyInjun

+0

@ShaggyInjun:それは1.5年前の答えに関するコメントではなく、サンプルコードで完全な独自の質問でなければなりません。 –

1

XmlとtoJsonの静的メソッドを持つunderscore-lodashライブラリがあります。

コード例:

import com.github.underscore.lodash.$; 
import java.util.Map; 
import org.junit.Test; 
import static org.junit.Assert.assertEquals; 

public class StringTest { 

    @Test 
    public void toJsonFromXml() { 
     final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n" 
      + " <FirstItem>1</FirstItem>\n <SecondItem>2</SecondItem>\n</root>"; 
     assertEquals("{\n" 
      + " \"root\": {\n" 
      + " \"FirstItem\": \"1\",\n" 
      + " \"SecondItem\": \"2\"\n" 
      + " }\n" 
      + "}", 
      $.toJson((Map<String, Object>) $.fromXml(xml))); 
    } 
}