1 package org.collectionspace.services.common.xmljson;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.OutputStream;
6 import java.io.PrintWriter;
7 import java.util.Iterator;
8 import java.util.Stack;
10 import javax.xml.namespace.QName;
11 import javax.xml.stream.XMLEventReader;
12 import javax.xml.stream.XMLInputFactory;
13 import javax.xml.stream.XMLStreamConstants;
14 import javax.xml.stream.XMLStreamException;
15 import javax.xml.stream.events.Attribute;
16 import javax.xml.stream.events.Namespace;
17 import javax.xml.stream.events.StartElement;
18 import javax.xml.stream.events.XMLEvent;
20 import org.apache.commons.lang3.StringUtils;
21 import org.collectionspace.services.common.xmljson.parsetree.Node;
23 import com.fasterxml.jackson.core.JsonGenerationException;
24 import com.fasterxml.jackson.databind.JsonMappingException;
25 import com.fasterxml.jackson.databind.ObjectMapper;
27 public class XmlToJsonStreamConverter {
28 protected XMLEventReader eventReader;
29 protected PrintWriter writer;
30 protected Stack<Node> stack = new Stack<Node>();
31 protected Node parseResult = null;
33 public static String nodeNameForQName(QName name) {
34 String prefix = name.getPrefix();
35 String localPart = name.getLocalPart();
37 if (StringUtils.isNotEmpty(prefix)) {
38 return prefix + ":" + localPart;
44 public XmlToJsonStreamConverter(InputStream in, OutputStream out) throws XMLStreamException {
45 XMLInputFactory factory = XMLInputFactory.newInstance();
47 eventReader = factory.createXMLEventReader(in);
48 writer = new PrintWriter(out);
51 public void convert() throws XMLStreamException, JsonGenerationException, JsonMappingException, IOException {
52 while(eventReader.hasNext()){
53 XMLEvent event = eventReader.nextEvent();
55 switch(event.getEventType()) {
56 case XMLStreamConstants.CHARACTERS:
59 case XMLStreamConstants.START_ELEMENT:
60 onStartElement(event);
62 case XMLStreamConstants.END_ELEMENT:
65 case XMLStreamConstants.START_DOCUMENT:
66 onStartDocument(event);
68 case XMLStreamConstants.END_DOCUMENT:
74 ObjectMapper objectMapper = new ObjectMapper();
75 objectMapper.writeValue(writer, parseResult);
80 protected void onStartDocument(XMLEvent event) {
81 stack.push(new Node());
84 protected void onEndDocument(XMLEvent event) {
85 parseResult = stack.pop();
88 @SuppressWarnings("unchecked")
89 protected void onStartElement(XMLEvent event) {
90 StartElement element = event.asStartElement();
91 QName name = element.getName();
93 Node node = new Node(nodeNameForQName(name));
95 Iterator<Attribute> attrIter = element.getAttributes();
97 while(attrIter.hasNext()) {
98 Attribute attr = attrIter.next();
100 node.addAttribute(attr.getName().toString(), attr.getValue());
103 Iterator<Namespace> nsIter = element.getNamespaces();
105 while(nsIter.hasNext()) {
106 Namespace ns = nsIter.next();
108 node.addNamespace(ns.getPrefix(), ns.getNamespaceURI());
114 protected void onCharacters(XMLEvent event) {
115 String text = event.asCharacters().getData();
116 Node parent = stack.peek();
118 parent.addText(text);
121 protected void onEndElement(XMLEvent event) {
122 Node node = stack.pop();
123 Node parent = stack.peek();
125 parent.addChild(node);