package net.kittyandbear.xml;
//2012-03-18 johnpfeiffer needs a more abstract way of dealing with nested nodes
/*
Warning: Stax xml writing can create malformed or invalid xml
Namespaces provide more explicit context than just the hierarchy, the default namespace below is the xml namespace
tag defined as html, so every tag without a prefix (head,body) is really html:head and html:body
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!Comments in xml look like this>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title> web page title </title>
</head>
<body>
<p> <a href="http://example.org/"> example.org </a> </p>
</body>
</html>
*/
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
public class XMLWriter
{
//should be in a separate file utility class
FileOutputStream getFileOutputStream( String pathAndFilename )
{
FileOutputStream fo = null;
try{
fo = new FileOutputStream( pathAndFilename );
}catch( FileNotFoundException fnfe )
{ System.out.println( "Unable to open file for writing: " + pathAndFilename );
}
return fo;
}
void streamGenerated( OutputStream out )
{
XMLOutputFactory factory = null;
XMLStreamWriter xsw = null;
try{
factory = XMLOutputFactory.newInstance();
xsw = factory.createXMLStreamWriter( out );
xsw.writeStartDocument( "UTF-8" , "1.1" );
xsw.writeDTD( "\n" );
xsw.writeStartElement( "root" );
xsw.writeDTD( "\n" );
xsw.writeDTD( "\t" );
xsw.writeStartElement( "user" );
xsw.writeAttribute( "username" , "myusername" );
xsw.writeAttribute( "password" , "mypassword" );
xsw.writeEndElement();
xsw.writeDTD( "\n" );
xsw.writeDTD( "\t" );
xsw.writeStartElement( "server" );
xsw.writeAttribute( "host" , "myipaddress" );
xsw.writeAttribute( "password" , "mypassword" );
xsw.writeEndElement();
xsw.writeDTD( "\n" );
xsw.writeEndDocument();
xsw.writeDTD( "\n" );
xsw.flush();
xsw.close();
}catch( Exception e )
{ e.printStackTrace();
}
}
void factoryGenerated( OutputStream out )
{
XMLEventWriter writer = initializeXMLEventWriter( out );
XMLEventFactory factory = XMLEventFactory.newInstance();
XMLEvent newline = factory.createDTD( "\n" );
XMLEvent tab = factory.createDTD( "\t" );
XMLElementAttribute attribute = null;
try{
StartDocument startDocument = factory.createStartDocument( "UTF-8" , "1.1" );
writer.add( startDocument );
writer.add( newline );
startNode( factory , writer , "root" );
writer.add( newline );
attribute = new XMLElementAttribute( "username" , "myusername" );
attribute.add( "password" , "mypassword" );
writer.add( tab );
startNode( factory , writer , "user" , attribute );
finishNode( factory , writer , "user" );
writer.add( newline );
attribute = new XMLElementAttribute( "host" , "myipaddress" );
attribute.add( "password" , "mypassword" );
writer.add( tab );
startNode( factory , writer , "server" , attribute );
finishNode( factory , writer , "server" );
writer.add( newline );
finishNode( factory , writer , "root" );
writer.add( factory.createEndDocument() );
writer.close();
}catch( XMLStreamException xmlse )
{ xmlse.printStackTrace();
}catch( Exception e )
{ e.printStackTrace();
}
}
private XMLEventWriter initializeXMLEventWriter( OutputStream out )
{
XMLEventWriter writer = null;
try{
XMLOutputFactory of = XMLOutputFactory.newInstance();
writer = of.createXMLEventWriter( out );
}catch( XMLStreamException xmlse )
{ xmlse.printStackTrace();
}catch( Exception e )
{ e.printStackTrace();
}
return writer;
}
private void startNode( XMLEventFactory factory, XMLEventWriter writer , String name )
{
try{
StartElement startElement = factory.createStartElement( "" , "" , name );
writer.add( startElement );
}catch( NullPointerException npe )
{ System.err.println( "Factory, writer, or name cannot be null" );
}catch( XMLStreamException xmlse )
{ xmlse.printStackTrace();
}catch( Exception e )
{ e.printStackTrace();
}
}
void startNode( XMLEventFactory factory, XMLEventWriter writer , String name , XMLElementAttribute attribute )
{
StartElement startElement = null;
try{
startElement = factory.createStartElement( "" , "" , name , attribute.getAttributeIterator() , attribute.getNamespaceIterator() );
writer.add( startElement );
}catch( NullPointerException npe )
{ System.err.println( "Factory, writer, or name cannot be null" );
}catch( XMLStreamException xmlse )
{ xmlse.printStackTrace();
}catch( Exception e )
{ e.printStackTrace();
}
}
void finishNode( XMLEventFactory factory, XMLEventWriter writer , String name )
{
try{
EndElement endElement = factory.createEndElement( "" , "" , name );
writer.add( endElement );
}catch( NullPointerException npe )
{ System.err.println( "Factory, writer, or name cannot be null" );
}catch( XMLStreamException xmlse )
{ xmlse.printStackTrace();
}catch( Exception e )
{ e.printStackTrace();
}
}
} //end class