You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ymondrow <ym...@randomhouse.com> on 2007/11/09 18:48:35 UTC

AXIOM writes out duplicate default namespace declarations

Hello,

I am currently stuck with what seems like a bug in the AXIOM API.  If a
default namespace is declared, all child element nodes will repeat that
namespace declaration, greatly bloating the XML document.  I submitted this
via JIRA more than 2 months ago, but it appears that no one has even looked
at it yet (it still says "Unassigned").  I tried emailing the guys at
Apache, but I get no response.  Below is the JIRA submission.  Can anyone
please take a look at this and see if this can be resolved?  I would greatly
appreciate it!

                 Key: AXIS2-3155 
                 URL: https://issues.apache.org/jira/browse/AXIS2-3155 
             Project: Axis 2.0 (Axis2) 
          Issue Type: Bug 
          Components: om 
    Affects Versions: 1.3 
         Environment: Microsoft Windows 2003 Server, Java 1.5.0_11.  Axis2
version 1.3 (uses AXIOM version 1.2.5). 
            Reporter: Yechiel Mondrowitz 
             Fix For: 1.3 


When there is a default namespace declaration in a parent node, it seems
that AXIOM repeats that default namespace declaration for every child node. 
So if this piece of XML, with a default namespace in the <outerTag> is fed
to AXIOM: 

<outerTag xmlns="http://someNamespace"> 
    <innerTag> 
        <node1>Hello</node1> 
        <node2>Hello</node2> 
   </innerTag> 
</outerTag> 

What AXIOM returns is this: 

<outerTag xmlns="http://someNamespace"> 
    <innerTag xmlns="http://someNamespace"> 
        <node1 xmlns="http://someNamespace">Hello</node1> 
        <node2 xmlns="http://someNamespace">Hello</node2> 
   </innerTag> 
</outerTag> 

While this may be valid XML, it doubles or triples the size of the XML. 
With large XML results, this can mean serious performance issues, as double
or triple the bandwith is needed to transport it across the wire.  This only
appears to happen when the OMElement has not yet been built in memory, but
is still in the stream.  After it is already built, the problem goes away. 
So this problem only occurs if toStringWithConsume(), or
serializeAndConsume() is called on the OMElement.  When toString() is called
however, the resulting XML is fine.  Here is a small program to illustrate: 


import org.apache.axiom.om.*; 
import org.apache.axiom.om.impl.llom.util.*; 

public class Test1 { 
    public static void main(String [] args) { 
        try { 
            String xmlString = 
                "<outerTag xmlns=\"http://someNamespace\">" + 
                    "<innerTag>" + 
                        "<node1>Hello</node1>" + 
                        "<node2>Hello</node2>" + 
                   "</innerTag>" + 
                "</outerTag>"; 

            OMElement elem = AXIOMUtil.stringToOM(xmlString); 
            System.out.println("--- Calling toStringWithConsume() ---\n"); 
            System.out.println(elem.toStringWithConsume()); 

            xmlString = 
                "<outerTag xmlns=\"http://someNamespace\">" + 
                    "<innerTag>" + 
                        "<node1>Hello</node1>" + 
                        "<node2>Hello</node2>" + 
                   "</innerTag>" + 
                "</outerTag>"; 

            elem = AXIOMUtil.stringToOM(xmlString); 
            System.out.println("\n--- Calling toString() ---\n"); 
            System.out.println(elem.toString()); 
        } 
        catch(Exception e) { 
            e.printStackTrace(); 
        } 
    } 
} 


The output of this program is this (I added line breaks in the XML for
easier readability): 

--- Calling toStringWithConsume() --- 

<outerTag xmlns="http://someNamespace"> 
    <innerTag xmlns="http://someNamespace"> 
        <node1 xmlns="http://someNamespace">Hello</node1> 
        <node2 xmlns="http://someNamespace">Hello</node2> 
    </innerTag> 
</outerTag> 

--- Calling toString() --- 

<outerTag xmlns="http://someNamespace"> 
    <innerTag> 
        <node1>Hello</node1> 
        <node2>Hello</node2> 
    </innerTag> 
</outerTag> 

I consider this a very big problem for me, because we return very large XML
results, and this bloats the XML tremendously.  I had to refrain from using
default namespaces because of this.  I really hope this can be corrected in
time for the next release of Axis2 / AXIOM. 

-- 
View this message in context: http://www.nabble.com/AXIOM-writes-out-duplicate-default-namespace-declarations-tf4779121.html#a13671826
Sent from the Axis - Dev mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org