2011-12-03 22 views
5

XML içeriğinin yapısı ve yapısı hakkında herhangi bir bilginiz olmaksızın,JSON girişine dönüştürmek için herhangi bir yöntem (mümkünse Java kodu örnekleri ile) var mı? dosya, dize, vb)? Örneğin, büyük bir metin dosyasına depolanmış, bilinmeyen bir yapıya ve çoklu yuvalama düzeylerine sahip çok büyük bir XML veri kümesine sahip olduğunu varsayalım. Her şeyi belleğe okumak mümkün değildir (alan yetersizliğinden dolayı) ve bunu doğrudan St12 etiketlerini saptamak ve işlemek zorunda kalmadan (örneğin, START_ELEMENT, CHARACTERS, END_ELEMENT), bu kodu doğrudan JSON'a dönüştürmek isterler.XML'in Dinamik Olarak Dönüştürülmesi JSON

ideal çözüm, örneğin bir XML dosyası besler ve Reader veya InputStreamJSON üreten bir doğrudan hatta bir FileOutputStream beslenir veya edilecek, böylece dönüştürücü bir Reader veya InputStream almak olacaktır JSON, Jackson gibi ayrıştırıcı. Bu mümkün değilse, bir XML dosyasını aşamalı olarak okuyarak, JSON'a dönüştürüp başka bir dosyaya yazmanın en azından bir yolu kabul edilebilir bir uzlaşma olacaktır. XML/JSON/dönüştürme için kullanılabilir

Araçlar (örneğin, StaxON, JSON-lib, Jettison, XStream) olduğunu, ancak, bilinen bir yapının sadece dönüştürme yapmak görünmemektedir.

DÜZENLEME:, bir OutputStream veya (ayrıca yukarıda söz "dönüşüm" kapsayacak) Bir Writer, bir dizi yolla yapılabilir bir Reader veya InputStream Alma rağmen iyi sonuçlar için ve "sonsuz "giriş boyutları çok iş parçacığı içeriyor. Çözümler bu article in Ostermiller.org'da açıklanmıştır ve benzer bir uygulama IO-Tools library'da bulunabilir.

cevap

5

Java'nın yerleşik StAX uygulamasını kullanarak parse XML ve Jettison'dan produce JSON ürününe ilişkin basit bir örnek. Bu on Github gösteren bir kendine yeten Maven projesi oluşturduk

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 bu süper basit hale yazar bir okuyucu köprüleme için uygun bir add(XMLEventWriter) yöntemi vardır.

+0

Bu (veya standart çıkışa) çözümü "dosyasına yazma" sağlar. Cevap ve ekstra çaba için teşekkürler! – PNS

+0

Yorum etiketlerini bununla nasıl yok sayarsınız? XMLEventWriter, xml'de yorum etiketleri olduğunda istisnalar atar. – ShaggyInjun

+0

@ShaggyInjun: Kendi sorusu, örnek kodla tamamlanmış olmalı, 1.5 yaşındaki bir cevap hakkında yorum yapmamalıdır. –

1

0mlkütüphanesi, Xml ve json'dan statik yöntemlere sahiptir.

Kod örnek:

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))); 
    } 
} 
İlgili konular