package org.holoeverywhere.resbuilder; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringWriter; import java.util.Iterator; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamWriter; import org.json.JSONObject; import org.json.XML; public class XmlUtils { private static final String ATTRS = "attrs"; private static final XMLOutputFactory OUTPUT_FACTORY = XMLOutputFactory.newFactory(); public static String json2xml(JSONObject json) { try { if (json.length() != 1) { JSONObject root = new JSONObject(); root.put("root", json); json = root; } StringWriter writer = new StringWriter(); XMLStreamWriter xml = OUTPUT_FACTORY.createXMLStreamWriter(writer); xml.writeStartDocument(); json2xml(json, xml); xml.writeEndDocument(); return writer.toString(); } catch (Exception e) { return null; } } @SuppressWarnings("unchecked") private static void json2xml(JSONObject json, XMLStreamWriter xml) throws Exception { Iterator<String> keys; if (json.has(ATTRS)) { JSONObject attrs = json.getJSONObject(ATTRS); keys = attrs.keys(); while (keys.hasNext()) { final String key = keys.next(); xml.writeAttribute(key, attrs.optString(key, "")); } } keys = json.keys(); while (keys.hasNext()) { final String key = keys.next(); if (ATTRS.equals(key)) { continue; } xml.writeStartElement(key); Object value = json.get(key); if (value instanceof JSONObject) { json2xml((JSONObject) value, xml); } else { xml.writeCharacters(String.valueOf(value)); } xml.writeEndElement(); } } public static JSONObject xml2json(InputStream is) { return xml2json(new InputStreamReader(is)); } public static JSONObject xml2json(Reader reader) { try { char[] buffer = new char[1024]; int c; StringBuilder builder = new StringBuilder(); while ((c = reader.read(buffer)) > 0) { builder.append(buffer, 0, c); } reader.close(); return xml2json(builder.toString()); } catch (Exception e) { return null; } } private static JSONObject xml2json(String xml) { try { return XML.toJSONObject(xml); } catch (Exception e) { e.printStackTrace(); return null; } } }