ProblemYou want to generate your own XML files or modify existing documents. SolutionUse DOM or JDOM; parse or create the document and call its write method. DiscussionSun's XmlDocument class has a write( ) method that can be called with either an OutputStream or a Writer. To use it, create an XML document object using the XmlDocument constructor. Create nodes, append them into the tree, and then call the document's write( ) method. For example, suppose you want to generate a poem in XML. Running the program and letting the XML appear on the standard output might look something like this: $ java DocWrite <?xml version="1.0" encoding="UTF-8"?> <Poem> <Stanza> <Line>Once, upon a midnight dreary</Line> <Line>While I pondered, weak and weary</Line> </Stanza> </Poem> $ The code for this is fairly short; see Example 21-9 for the code using DOM. Code for using JDOM is similar; see DocWriteJDOM.java in the online source code. Example 21-9. DocWriteDOM.javaimport java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; /** Make up and write an XML document, using DOM * UPDATED FOR JAXP. * @author Ian Darwin, http://www.darwinsys.com/ * @version $Id: ch21.xml,v 1.5 2004/05/04 20:13:38 ian Exp $ */ public class DocWriteDOM { public static void main(String[] av) throws IOException { DocWriteDOM dw = new DocWriteDOM( ); Document doc = dw.makeDoc( ); // Sadly, the write( ) method is not in the DOM spec, so we // have to cast the Document to its implementing class // in order to call the Write method. // // WARNING // // This code therefore depends upon the particular // parser implementation. // ((org.apache.crimson.tree.XmlDocument)doc).write(System.out); } /** Generate the XML document */ protected Document makeDoc( ) { try { DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance( ); DocumentBuilder parser = fact.newDocumentBuilder( ); Document doc = parser.newDocument( ); Node root = doc.createElement("Poem"); doc.appendChild(root); Node stanza = doc.createElement("Stanza"); root.appendChild(stanza); Node line = doc.createElement("Line"); stanza.appendChild(line); line.appendChild(doc.createTextNode("Once, upon a midnight dreary")); line = doc.createElement("Line"); stanza.appendChild(line); line.appendChild(doc.createTextNode("While I pondered, weak and weary")); return doc; } catch (Exception ex) { System.err.println("+============================+"); System.err.println("| XML Error |"); System.err.println("+============================+"); System.err.println(ex.getClass( )); System.err.println(ex.getMessage( )); System.err.println("+============================+"); return null; } } } A more complete program would create an output file and have better error reporting. It would also have more lines of the poem than I can remember. Sun's XmlDocument class is not a committed part of the standard, which is why the code casts the object to org.apache.crimson.tree.XmlDocument before calling its write method. However, other vendors' APIs have similar functionality. |