[jdom-interest] [PATCH] DOMOutputter and namespace aware Documents

Ortwin Glück odi at odi.ch
Fri May 26 02:07:05 PDT 2006


I propose the attached change to DOMOutputter.

This seems to work. Test case:

package test;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.DOMOutputter;

public class JDomTest extends TestCase {
      private Document doc;

      public JDomTest() {
          doc = new Document();
          Element root = new Element("root");
          Element el = new Element("a");
          el.setText("abc");
          root.addContent(el);
          doc.setRootElement(root);
      }

      public void testNsSupport() throws Exception {
          DOMOutputter out = new DOMOutputter();
          out.setForceNamespaceAware(true);
          org.w3c.dom.Document dom = out.output(doc);
          org.w3c.dom.Element el = dom.getDocumentElement();
          System.out.println("Dom impl: "+ el.getClass().getName());
          assertNotNull(el.getLocalName());
      }
}

-------------- next part --------------
Index: org/jdom/output/DOMOutputter.java
===================================================================
RCS file: /home/cvspublic/jdom/src/java/org/jdom/output/DOMOutputter.java,v
retrieving revision 1.41
diff -u -r1.41 DOMOutputter.java
--- org/jdom/output/DOMOutputter.java	3 Sep 2004 06:03:42 -0000	1.41
+++ org/jdom/output/DOMOutputter.java	23 May 2006 09:29:30 -0000
@@ -86,6 +86,8 @@
 
     /** Adapter to use for interfacing with the DOM implementation */
     private String adapterClass;
+    
+    private boolean forceNamespaceAware;
 
     /**
      * This creates a new DOMOutputter which will attempt to first locate
@@ -106,6 +108,15 @@
     public DOMOutputter(String adapterClass) {
         this.adapterClass = adapterClass;
     }
+    
+    /**
+     * Controls how NO_NAMESPACE nodes are handeled. If true the outputter always creates
+     * namespace a aware DOM.
+     * @param flag
+     */
+    public void setForceNamespaceAware(boolean flag) {
+        this.forceNamespaceAware = flag;
+    }
 
 
     /**
@@ -250,7 +261,9 @@
             org.w3c.dom.Element domElement = null;
             if (element.getNamespace() == Namespace.NO_NAMESPACE) {
                 // No namespace, use createElement
-                domElement = domDoc.createElement(element.getQualifiedName());
+                domElement = forceNamespaceAware ?
+                             domDoc.createElementNS(null, element.getQualifiedName())
+                             : domDoc.createElement(element.getQualifiedName());
             }
             else {
                 domElement = domDoc.createElementNS(
@@ -308,8 +321,14 @@
                 // Crimson doesn't like setAttributeNS() for non-NS attribs
                 if (attribute.getNamespace() == Namespace.NO_NAMESPACE) {
                     // No namespace, use setAttribute
-                    domElement.setAttribute(attribute.getQualifiedName(),
-                                            attribute.getValue());
+                    if (forceNamespaceAware) {
+                        domElement.setAttributeNS(null,
+                                                  attribute.getQualifiedName(),
+                                                  attribute.getValue());
+                    } else {
+                        domElement.setAttribute(attribute.getQualifiedName(),
+                                                attribute.getValue());
+                    }
                 }
                 else {
                     domElement.setAttributeNS(attribute.getNamespaceURI(),
@@ -392,7 +411,11 @@
          try {
              if (attribute.getNamespace() == Namespace.NO_NAMESPACE) {
                  // No namespace, use createAttribute
-                 domAttr = domDoc.createAttribute(attribute.getQualifiedName());
+                 if (forceNamespaceAware) {
+                     domAttr = domDoc.createAttributeNS(null, attribute.getQualifiedName());
+                 } else {
+                     domAttr = domDoc.createAttribute(attribute.getQualifiedName());
+                 }
              }
              else {
                  domAttr = domDoc.createAttributeNS(attribute.getNamespaceURI(),



More information about the jdom-interest mailing list