XML转换成json

来源:互联网 发布:mac文本编辑器 编辑:程序博客网 时间:2024/06/05 20:34

方式一:

import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import net.sf.json.JSON;import net.sf.json.xml.XMLSerializer;public class XMLToJson {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubString xml = readXML();System.out.println(xml);XMLSerializer xmlSerializer = new XMLSerializer();//deal with the special field "type"xmlSerializer.setTypeHintsCompatibility(false);xmlSerializer.setTypeHintsEnabled(false);//xmlSerializer.setSkipNamespaces(true);//xmlSerializer.setSkipWhitespace(true);JSON json = xmlSerializer.read(xml);System.out.println(json.toString());//JsonAnalysis josnAnalysis = new JsonAnalysis(json.toString());//josnAnalysis.retrieveJson();}// read xml fileprivate static String readXML() throws IOException {String path = "C:\\Users\\hitler\\Desktop\\datatype\\bioproject_result.xml";FileInputStream fileInputStream = new FileInputStream(path);BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));String xml = "";String line;while ((line = reader.readLine()) != null) {xml = xml + line;}reader.close();return xml;}}

使用net.sf.json.xml.XMLSerializer解析的时候,会出现以下几个问题:

(1)当元素的属性中有"type"的时候,XMLSerializer默认是不解析的,如果想要程序对这个属性进行解析的话,需要添加以下代码:

xmlSerializer.setTypeHintsCompatibility(false);xmlSerializer.setTypeHintsEnabled(false);


(2)当元素节点没有属性的时候,XMLSerilizer就不会对其进行解析,具体解决办法参照【方式二】


方式二:

采用github上面的一个解析工具进行解析;

MavenDependency:

    <dependency>        <groupId>de.odysseus.staxon</groupId>        <artifactId>staxon</artifactId>        <version>1.3</version>    </dependency>    <!-- or, to use the Jackson streaming backend -->    <dependency>        <groupId>de.odysseus.staxon</groupId>        <artifactId>staxon-jackson</artifactId>        <version>1.3</version>    </dependency>

具体应用代码:

示例一:

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamException;import javax.xml.stream.XMLStreamReader;import javax.xml.stream.XMLStreamWriter;import javax.xml.transform.Result;import javax.xml.transform.Source;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.stax.StAXResult;import javax.xml.transform.stax.StAXSource;import de.odysseus.staxon.json.JsonXMLConfig;import de.odysseus.staxon.json.JsonXMLConfigBuilder;import de.odysseus.staxon.json.JsonXMLOutputFactory;public class XmlToJsonStaxon {/** * Copy/format XML as JSON using * {@link Transformer#transform(Source, Result)}. *  * @param args *            ignored * @throws TransformerException * @throws XMLStreamException */public static void main(String[] args) throws TransformerException,XMLStreamException, IOException {InputStream input = XmlToJsonStaxon.class.getResourceAsStream("input.xml");OutputStream output = System.out;/* * If we want to insert JSON array boundaries for multiple elements, we * need to set the <code>autoArray</code> property. If our XML source * was decorated with <code><?xml-multiple?></code> processing * instructions, we'd set the <code>multiplePI</code> property instead. * With the <code>autoPrimitive</code> property set, element text gets * automatically converted to JSON primitives (number, boolean, null). */JsonXMLConfig config = new JsonXMLConfigBuilder().autoArray(false).autoPrimitive(true).prettyPrint(true).build();try {/* * Create source (XML). */XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(input);Source source = new StAXSource(reader);/* * Create result (JSON). */XMLStreamWriter writer = new JsonXMLOutputFactory(config).createXMLStreamWriter(output);Result result = new StAXResult(writer);/* * Copy source to result via "identity transform". */TransformerFactory.newInstance().newTransformer().transform(source, result);System.out.println();/* * JsonAnalysis josnAnalysis = new JsonAnalysis((JSON) System.out); * josnAnalysis.retrieveJson(); */} finally {/* * As per StAX specification, XMLStreamReader/Writer.close() doesn't * close the underlying stream. */output.close();input.close();}}}
示例二:

import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.StringReader;import java.io.StringWriter;import javax.xml.stream.XMLEventReader;import javax.xml.stream.XMLEventWriter;import javax.xml.stream.XMLInputFactory;import de.odysseus.staxon.json.JsonXMLConfig;import de.odysseus.staxon.json.JsonXMLConfigBuilder;import de.odysseus.staxon.json.JsonXMLOutputFactory;public class StaxonUtils {public static void main(String[] args) throws IOException {String xml = readXML();String json = xml2json(xml);System.out.println(json);JsonAnalysis josnAnalysis = new JsonAnalysis(json);josnAnalysis.retrieveJson();}// read xml fileprivate static String readXML() throws IOException {String path = "C:\\Users\\hitler\\Desktop\\datatype\\bioproject_result_neww.xml";FileInputStream fileInputStream = new FileInputStream(path);BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));String xml = "";String line;while ((line = reader.readLine()) != null) {xml = xml + line;}reader.close();return xml;}// convert xml to jsonpublic static String xml2json(String xml) {StringReader input = new StringReader(xml);StringWriter output = new StringWriter();JsonXMLConfig config = new JsonXMLConfigBuilder().autoArray(false).autoPrimitive(true).prettyPrint(true).build();try {XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(input);XMLEventWriter writer = new JsonXMLOutputFactory(config).createXMLEventWriter(output);writer.add(reader);reader.close();writer.close();} catch (Exception e) {e.printStackTrace();} finally {try {output.close();input.close();} catch (IOException e) {e.printStackTrace();}}return output.toString();}}



0 0
原创粉丝点击