View Javadoc

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  }