有没有办法(使用Java代码示例,如果可能的话)在不知道实际内容和XML源结构(文件,字符串等)的情况下即时转换XML输入JSON?
例如,假设一个具有未知结构和多个嵌套级别的非常大的XML数据集,存储到一个大文本文件中.一切都读入内存是不可能的(由于篇幅),他们希望这一转换成JSON直接的,即,而无需编写任何代码来检测和处理StAX的标签(例如,START_ELEMENT,CHARACTERS,END_ELEMENT).
理想的解决办法是让一个Reader或InputStream从转换器,这样,例如,一个供应XML文件和Reader或者InputStream产生JSON,被输送到一个FileOutputStream,甚至直接到JSON像解析器Jackson.如果这是不可能的,至少一种逐步读取XML文件,转换为JSON并写入另一个文件的方法将是可接受的折衷方案.
可用于从/向XML/JSON转换的工具(例如,StaxON,JSON-lib,Jettison,XStream)似乎不会这样做,而只是转换已知结构.
编辑:获取一个Reader或InputStream来自OutputStream或Writer(也可以涵盖我上面谈到的"转换"),可以通过多种方式完成,但为了获得最佳结果和"无限"输入大小,需要涉及多线程.本文在Ostermiller.org中描述了解决方案,类似的实现可以在IO-Tools库中找到.
这是一个简单的例子,使用Java的内置StAX实现来解析XML和Jettison以从中生成JSON.该XMLEventWriter的有一个方便的add(XMLEventWriter)桥接读者一个作家,使这个超级简单的方法:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经在Github上创建了一个独立的Maven项目.
| 归档时间: |
|
| 查看次数: |
7659 次 |
| 最近记录: |