1 package org.codehaus.xfire.util;
2
3 import javax.xml.stream.XMLStreamException;
4 import javax.xml.stream.XMLStreamWriter;
5
6 import org.w3c.dom.Element;
7 import org.w3c.dom.NamedNodeMap;
8 import org.w3c.dom.Node;
9 import org.w3c.dom.NodeList;
10
11 /***
12 * Writes out a org.w3c.dom tree to a STAX stream.
13 *
14 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
15 * @since Oct 21, 2004
16 */
17 public class DOMStreamWriter
18 {
19 /***
20 * Writes an Element to an XMLStreamWriter. The writer must already
21 * have started the doucment (via writeStartDocument()).
22 *
23 * @param e
24 * @param writer
25 * @throws XMLStreamException
26 */
27 public static void writeElement( Element e, XMLStreamWriter writer )
28 throws XMLStreamException
29 {
30 if ( e.getNamespaceURI() != null )
31 {
32 boolean writeNamespace = false;
33 String prefix = writer.getNamespaceContext().getPrefix(e.getNamespaceURI());
34 if ( prefix == null )
35 {
36 prefix = e.getPrefix();
37 writeNamespace = true;
38 }
39
40 if ( prefix == null )
41 {
42 writer.setDefaultNamespace(e.getNamespaceURI());
43 writeNamespace = false;
44 writer.writeStartElement( e.getNodeName() );
45 writer.writeDefaultNamespace(e.getNamespaceURI());
46 }
47 else
48 {
49 writer.writeStartElement( prefix + ":" + e.getNodeName() );
50 }
51
52 if ( writeNamespace )
53 {
54 writer.writeNamespace(prefix, e.getNamespaceURI());
55 }
56 }
57 else
58 {
59 writer.writeStartElement( e.getNodeName() );
60 }
61
62 NamedNodeMap attrs = e.getAttributes();
63 for ( int i = 0; i < attrs.getLength(); i++ )
64 {
65 Node attr = attrs.item(i);
66
67 boolean writeAttrNamespace = false;
68 String attrPrefix = writer.getNamespaceContext().getPrefix(attr.getNamespaceURI());
69 if ( attrPrefix == null )
70 {
71 writeAttrNamespace = true;
72 attrPrefix = attr.getPrefix();
73 }
74
75 writer.writeAttribute(attrPrefix, attr.getNamespaceURI(), attr.getNodeName(), attr.getNodeValue());
76
77 if ( writeAttrNamespace )
78 {
79 writer.writeNamespace(attrPrefix, e.getNamespaceURI());
80 }
81 }
82
83 String value = DOMUtils.getContent(e);
84
85 if ( value != null )
86 writer.writeCharacters( value );
87
88 NodeList nodes = e.getChildNodes();
89 for ( int i = 0; i < nodes.getLength(); i++ )
90 {
91 Node n = nodes.item(i);
92 if ( n instanceof Element )
93 {
94 writeElement((Element)e, writer);
95 }
96 }
97 writer.writeEndElement();
98 }
99 }