import org.w3c.dom.Element; import org.w3c.dom.Document; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.IOException; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.StreamTokenizer; public class DOMExpand { static CompactTokenizer st; public static void main( String[] argv ) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); st = new CompactTokenizer( new BufferedReader( new InputStreamReader( new FileInputStream(argv[0])))); String rootName = "dummyElement"; // ignore everything preceding the word before the first "[" while(!st.nextToken().equals("[")){ rootName=st.getToken(); } expand((Element)doc.appendChild(doc.createElement(rootName.trim()))); // output with an "identity" Transformer TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT,"yes"); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(System.out); transformer.transform(source,result); } catch ( Exception ex ) { ex.printStackTrace(); } } static void expand(Element elem) throws IOException{ Document doc = elem.getOwnerDocument(); st.skip("["); while(st.getToken().equals("@")){// process attributes String attName = st.nextToken(); st.nextToken(); elem.setAttribute(attName,st.skip("[")); st.nextToken(); st.skip("]"); } while(!st.getToken().equals("]")){ // process element String s = st.getToken().trim(); st.nextToken(); if(st.getToken().equals("[")) expand((Element)elem.appendChild(doc.createElement(s))); else{ elem.appendChild(doc.createTextNode(s)); } } st.skip("]"); } }