Submitting this just for consideration .... This version of BeanWriter will serialize an object graph as DOM as oppose to string. Might be useful in some cases.
package COM.soundbite.xml.serialization; import java.io.IOException; import java.util.Stack; import org.apache.commons.betwixt.XMLUtils; import org.apache.commons.betwixt.io.WriteContext; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.Attributes; import org.xml.sax.SAXException; /** * A class that overrides standard behaviour of the betwixt by serializing into DOM rather than string * * @author mkolesnik * @version $Id: $ * */ public class DOMBeanWriter extends BeanWriter { private Element rootElement; private Document rootDocument; private Stack elements = new Stack(); /** * creates new instance of the writer that will create DOM rooted at * the element passed in * @param root root element to append the rest to. */ public DOMBeanWriter(Element root) { rootDocument = root.getOwnerDocument(); rootElement = root; } /** * creates new instance of the writer that will create DOM starting from the root node passed in * @param root root element to append the rest to. */ public DOMBeanWriter(Document root) { rootDocument = root; } public void start() throws IOException, SAXException { if (rootElement != null) { elements.push(rootElement); } else { elements.push(rootDocument); } } public void end() throws IOException, SAXException { elements.pop(); } protected void startElement(WriteContext context, String uri, String localName, String qualifiedName, Attributes attr) throws IOException, SAXException { Node parent = (Node) elements.peek(); Element currentElement = rootDocument.createElement(localName); parent.appendChild(currentElement); elements.push(currentElement); for (int i = 0; i < attr.getLength(); i++) { currentElement.setAttribute(attr.getQName(i), XMLUtils.escapeAttributeValue( attr.getValue(i))); } } protected void endElement(WriteContext context, String uri, String localName, String qualifiedName) throws IOException, SAXException { elements.pop(); } protected void bodyText(WriteContext context, String text) throws IOException { Node currentElement = (Node) elements.peek(); Node newElement = rootDocument.createTextNode( getMixedContentEncodingStrategy().encode( text, context.getCurrentDescriptor())); currentElement.appendChild(newElement); } }