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 > > > > > > >