Yes, I know. That clearly was not my point.
- James Snell
Software Engineer, Internet Emerging Technologies, IBM
James M Snell/Fresno/IBM - [EMAIL PROTECTED]
These things I have spoken to you, so that in Me you may have peace.
In the world you have tribulation, but take courage; I have overcome the
world.
- John 16:33
Please respond to [EMAIL PROTECTED]
To: <[EMAIL PROTECTED]>
cc:
Subject: RE: Bug with DOM2Writer
Hi James,
I imagine that to have bugs fixed in product XYZ, you follow product XYZ's
procedure for having bugs fixed. For instance, ours is to use Bugzilla.
Thanks,
-Matt
> -----Original Message-----
> From: James M Snell [mailto:[EMAIL PROTECTED]]
> Sent: Friday, September 28, 2001 11:50 AM
> To: [EMAIL PROTECTED]
> Subject: Re: Bug with DOM2Writer
>
>
> Matt,
>
> Yes, I am quite aware of this, but the already in production code that I
> cannot change does not live by these rules. And I know that there is
> lotsa other code out there that doesn't either. How would you propose
we
> deal with those situations?
>
> - James Snell
> Software Engineer, Internet Emerging Technologies, IBM
> James M Snell/Fresno/IBM - [EMAIL PROTECTED]
> These things I have spoken to you, so that in Me you may have peace.
> In the world you have tribulation, but take courage; I have overcome the
> world.
> - John 16:33
>
> Please respond to [EMAIL PROTECTED]
> To: [EMAIL PROTECTED], James M Snell/Fresno/IBM@IBMUS
> cc: "Sanjiva Weerawarana" <[EMAIL PROTECTED]>, Sam
> Ruby/Raleigh/IBM@IBMUS
> Subject: Re: Bug with DOM2Writer
>
>
>
>
> Hi James,
>
> I agree with Sanjiva. The problem is the way you are using the DOM APIs.
>
> To create a qualified element, the method is:
>
> public Element createElementNS(java.lang.String namespaceURI,
> java.lang.String qualifiedName) throws DOMException
>
> Note that the second argument is called "qualifiedName". So, you would
> write:
>
> Element test = doc.createElementNS("testing", "s:test");
>
> not:
>
>
> > Element test = doc.createElementNS("testing", "test");
> > test.setPrefix("s");
> > test.setAttribute("xmlns:s", "testing");
>
> > Why am I adding the test.setAttribute("xmlns:s", "testing")? Because
> > that's about the only ways to declare namespaces in the DOM API. I
> could
>
> You can declare them implicitly by using them. Search through the
JavaDocs
> for org.w3c.dom.Element and org.w3c.dom.Document, looking for "xmlns",
and
> they say a bit more about this.
>
> > I could get around this problem by simply removing the
> > test.setAttribute("xmlns:s", "testing") line, but unfortunately, I
don't
> > have access to the code that creates the real DOM document I'm trying
to
> > work with (the above is just an example). So the setAttribute line
> > remains and we have to work around the problem within the DOM2Writer.
>
> I believe the bug is in the code which is calling test.setAttribute
> ("xmlns:s", "testing"). Not to mention that qualified attributes are
> supposed to be created by calling Element.setAttributeNS(...), not
> Element.setAttribute(...). If you don't use the correct factory methods,
> you are creating Nodes which appear qualified, but are in fact not (at
> least as far as the DOM representation is concerned).
>
> If you use the correct method call to set the qualified attribute,
> DOM2Writer will interpret this as a namespace declaration, and do the
> right
> thing. That is, you should be using:
>
> test.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:s",
> "testing");
>
> To set the namespace declaration.
>
> Thanks,
> -Matt
>
>
>
>
>
> "Sanjiva
> Weerawarana" To: <[EMAIL PROTECTED]>,
> Matthew Duftler/Watson/IBM@IBMUS, Sam
> <sanjiva@watso Ruby/Raleigh/IBM@IBMUS
> n.ibm.com> cc:
> Subject: Re: Bug with
> DOM2Writer
> 09/28/2001
> 02:33 AM
>
>
>
>
>
> This is not a bug. So please do not commit this change!
>
> The problem is that you're using the DOM APIs incorrectly.
> If you start creating attributes that look like qualified names,
> then you'll confuse the writer (and lots of other things). If you
> want to create a namespaced attribute, then there's a right way
> to do it - you are doing it the wrong way. The key point is
> that xmlns:s is *not* an attribute of the {testing}test element.
>
> Sanjiva.
>
> ----- Original Message -----
> From: "James M Snell" <[EMAIL PROTECTED]>
> To: "Matthew Duftler" <[EMAIL PROTECTED]>; "Sam Ruby"
<[EMAIL PROTECTED]>;
> <[EMAIL PROTECTED]>
> Sent: Friday, September 28, 2001 2:53 AM
> Subject: Bug with DOM2Writer
>
>
> > Package: org.apache.soap.util.xml.DOM2Writer
> >
> > Problem: In some cases, the DOM2Writer will output duplicate XML
> namespace
> > declarations on a single element, thereby making the XML output
invalid.
> >
> > Example, let's say I want to create the following XML output:
> >
> > <s:test xmlns:s="testing>
> > <hello />
> > </s:test>
> >
> > To do so, I use the following code.
> >
> > Document doc = ... create document
> > Element test = doc.createElementNS("testing", "test");
> > test.setPrefix("s");
> > test.setAttribute("xmlns:s", "testing");
> > Element hello = doc.createElementNS("testing", "hello");
> > test.appendChild(hello);
> > doc.appendChild(test);
> >
> > Run this through the DOM2Writer, and the output is:
> >
> > <s:test xmlns:s="testing" xmlns:s="testing">
> > <hello />
> > </s:test>
> >
> > Notice the duplicate xmlns:s declarations.
> >
> > This is caused by the fact that the xmlns:s declaration is set as an
> > attribute on the element. DOM2Writer checks to see if the element
> > namespace and prefix have been declared before serializing all of the
> > attributes. In this case, if the "s" prefix for the "testing"
namespace
> > has not been declared, the xmlns:s="testing" is added to the XML
output.
> > Then, however, the attributes are looped through and serialized,
causing
> a
> > duplicate declaration to be printed.
> >
> > Why am I adding the test.setAttribute("xmlns:s", "testing")? Because
> > that's about the only ways to declare namespaces in the DOM API. I
> could
> > get around this problem by simply removing the
> > test.setAttribute("xmlns:s", "testing") line, but unfortunately, I
don't
> > have access to the code that creates the real DOM document I'm trying
to
> > work with (the above is just an example). So the setAttribute line
> > remains and we have to work around the problem within the DOM2Writer.
> >
> > Proposed Solution:
> >
> > When looping through the attributes, check to see if the attribute is
an
> > XML namespace declaration, and if so, whether or not the namespace has
> > already been declared. If so, skip it and move on.
> >
> > The proposed modified DOM2Writer is attached. Can somebody please
> review
> > to make sure that my head is screwed on straight and I didn't overlook
> > something before I commit it.
> >
> >
> >
> > - James Snell
> > Software Engineer, Internet Emerging Technologies, IBM
> > James M Snell/Fresno/IBM - [EMAIL PROTECTED]
> > These things I have spoken to you, so that in Me you may have peace.
> > In the world you have tribulation, but take courage; I have overcome
the
> > world.
> > - John 16:33
>
>
>
>
>
>
>