[jdom-interest] Empty xmlns in reconstructed XML

David M. Lang david at proxsys.co.uk
Fri Aug 18 03:10:05 PDT 2006


Hi Jason,

	I agree entirely. Ideally, elements to be inserted into the primary
document should have the same namespace as the document itself. However, the
context for this is an XCAP server application, whose specification doesn't
appear to mandate that incoming XML has the default namespace attached.

I did as you suggested, by simply sub-classing DefaultJDOMFactory.
A very neat solution. Thanks for your input.

Best regards,

David Lang

-----Original Message-----
From: jdom-interest-bounces at jdom.org [mailto:jdom-interest-bounces at jdom.org]
On Behalf Of Jason Hunter
Sent: 17 August 2006 21:06
To: Edelson, Justin
Cc: jdom-interest at jdom.org
Subject: Re: [jdom-interest] Empty xmlns in reconstructed XML

Probably easier, you could also use a custom JDOMFactory so during the build
each element was placed into the proper namespace from the get-go.

The fundamental issue is you're building a document with elements in
NO_NAMESPACE, adding them to a document with a namespace, and wanting the
NO_NAMESPACE to vanish, but NO_NAMESPACE is as much a namespace as any
other.  If you include an xhtml table in a furniture store document, it
doesn't become a furniture table.

-jh-

Edelson, Justin wrote:
>> I would regard iterating over ALL
>> elements in a complex multi-level secondary document, assigning a
> namespace
>> to each as hugely inefficient. I don't see how this could be deemed 
>> otherwise.
> 
> One thing you might want to look at is using an org.xml.sax.XMLFilter 
> to modify the stream of SAX events to specify a namespace URI where 
> there is none. But that assumes you're using SAXBuilder and don't need 
> the no-namespace versions of the Elements for any other purpose. I 
> suspect you would consider this to be less "hugely inefficient" than 
> walking the descendent tree.
> 
> 
> 
> 
> -----Original Message-----
> From: jdom-interest-bounces at jdom.org
> [mailto:jdom-interest-bounces at jdom.org] On Behalf Of David M. Lang
> Sent: Thursday, August 17, 2006 12:51 PM
> To: jdom-interest at jdom.org
> Cc: john.sletten at netcom.no
> Subject: RE: [jdom-interest] Empty xmlns in reconstructed XML
> 
> 
>  
> Hi Justin,
> 
> 	Thanks again for the response. To repeat, the primary document is 
> read from the file system. I was just using a shorthand annotation 
> (...) to simplify the description. In full :-
> 
> File file = new File("location");
> FileInputStream fis = new FileInputStream(file); Document primary = 
> new Document(fis); etc, etc
> 
> Anyway, this isn't the relevant bit. I would regard iterating over ALL 
> elements in a complex multi-level secondary document, assigning a 
> namespace to each as hugely inefficient. I don't see how this could be 
> deemed otherwise. As I pointed out in my original mail, the example 
> shown was grossly simplified for purposes of illustratation. I'm sure 
> there's a better way - I just must be missing something. BTW, this is 
> an XCAP server application (Rosenberg), which doesn't mandate that 
> incoming XML has the default namespace attached.
> 
> Regards,
> 
> David
> 
> -----Original Message-----
> From: Edelson, Justin [mailto:Justin.Edelson at mtvn.com]
> Sent: 17 August 2006 17:13
> To: David M. Lang; jdom-interest at jdom.org
> Cc: john.sletten at netcom.no
> Subject: RE: [jdom-interest] Empty xmlns in reconstructed XML
> 
>> Document primary = new Document(...);       // The primary document is
> read from the file system
> You say it's read from the filesystem, but this code is creating a new 
> Document.
> 
>> It seems to me that I need to iterate through the secondary document 
>> to assign the default namespace to all elements, to prevent the 
>> creation of the empty namespace.
> If the elements from the secondary document are not in a namespace and 
> you need them to be in a namespace, then yes, you need to assign the 
> namespace to each element. You are changing the namespace of each 
> element which requires a call to setNamepsace()
> 
>> But this is hugely inefficient.
> Is it? From what perspective?
> 
> Just a thought, but why aren't the elements in the secondary document 
> in the correct namespace? That seems to be the root of your problem.
> 
> -----Original Message-----
> From: jdom-interest-bounces at jdom.org
> [mailto:jdom-interest-bounces at jdom.org] On Behalf Of David M. Lang
> Sent: Thursday, August 17, 2006 11:10 AM
> To: jdom-interest at jdom.org
> Cc: john.sletten at netcom.no
> Subject: RE: [jdom-interest] Empty xmlns in reconstructed XML
> 
> Hi Justin,
> 
> 	Thanks for the response. Firstly, apologies, I am using JDOM 
> ('XmlElement' was a typo)! I'm not sure what you mean, though. I build 
> a secondary Document from an InputStream, and extract the root element 
> - this then becomes the child element I need to insert into a primary 
> document, at a given XPATH location.
> 
> Document primary = new Document(...);       // The primary document is
> read
> from the file system
> Element node = ...                          // XPATH selects a location
> within the document
> 
> InputStream is ...                          // The secondary document is
> built from a stream (HTTP request)
> SAXBuilder builder = new SAXBuilder(); Document secondary = 
> builder.build(is); Element child = secondary.getRootElement(); // The 
> child element to be added to the primary node
> 
> node.addContent((Element)child.clone());    // Clone to prevent
> IllegalAddException
> 
> That's it. I don't do any explicit Element creation; I just add the 
> child element to the selected node. It seems to me that I need to 
> iterate through the secondary document to assign the default namespace 
> to all elements, to prevent the creation of the empty namespace. But 
> this is hugely inefficient.
> So I'm looking for a better way !
> 
> Regards,
> David
> 
> -----Original Message-----
> From: jdom-interest-bounces at jdom.org
> [mailto:jdom-interest-bounces at jdom.org]
> On Behalf Of Edelson, Justin
> Sent: 17 August 2006 14:42
> To: jdom-interest at jdom.org
> Subject: RE: [jdom-interest] Empty xmlns in reconstructed XML
> 
> Three things:
> 1) You should use
> Namespace.getNamespace("urn:ietf:params:xml:ns:resource-lists") 
> instead of new Namespace(...). Namespace objects are meant to be used 
> with multiple Element and Attribute objects.
> 2) Instead of setNamepsace(Namespace), use new Element(String, 
> Namespace).
> That way you don't forget to attach the Namespace.
> 3) What's an XmlElement? You sure you're using JDOM?
> 
> Right, because the display-name element doesn't have a namespace. You 
> have to call setNamespace() or, as I said above, use the two-arg 
> constructor.
> 
> Assuming JDOM has assembled the Document from a namespace-aware 
> parser, you shouldn't have to do anything to the existing elements 
> within the parsed Document. However, for every element (and 
> potentially attribute, although apparently not in this case) you 
> CREATE, it's necessary to provide the appropriate Namespace object.
> 
> -----Original Message-----
> From: jdom-interest-bounces at jdom.org
> [mailto:jdom-interest-bounces at jdom.org] On Behalf Of David M. Lang
> Sent: Thursday, August 17, 2006 7:36 AM
> To: jdom-interest at jdom.org
> Cc: john.sletten at netcom.no
> Subject: [jdom-interest] Empty xmlns in reconstructed XML
> 
> Hi,
> 
> I'm trying to insert a child element into a document.
> For example, the following document:-
> 
> <?xml version="1.0" encoding="UTF-8"?> <resource-lists 
> xmlns="urn:ietf:params:xml:ns:resource-lists">
>   <list name="friends">
>     <entry uri="sip:john at differitas.com">
>       <display-name>John</display-name>
>     </entry>
>   </list>
> </resource-lists>
> 
> I want to add an <entry> child to the <list> element:-
> 
> <entry uri="sip:david at differitas.com">
>   <display-name>David</display-name>
> </entry>
> 
> This gives:-
> 
> <?xml version="1.0" encoding="UTF-8"?> <resource-lists 
> xmlns="urn:ietf:params:xml:ns:resource-lists">
>   <list name="friends">
>     <entry uri="sip:john at differitas.com">
>       <display-name>John</display-name>
>     </entry>
>     <entry xmlns="" uri="sip:david at differitas.com">
>       <display-name>David</display-name>
>     </entry>
>   </list>
> </resource-lists>
> 
> JDOM has added an empty default namespace to my new <entry> element. 
> OK, I understand that I've created the <entry> element without a 
> namespace, so the JDOM serializer adds xmlns="" to the child element 
> to prevent it from inheriting the default namespace of its parent. So, 
> before adding the <entry> element, I place it in the default 
> namespace:-
> 
> XmlElement child = ...
> XmlElement parent = ...
> child.setNamespace(new Namespace("",
> "urn:ietf:params:xml:ns:resource-lists"));
> parent.addContent(child);
> 
> I now got the following:-
> 
> <?xml version="1.0" encoding="UTF-8"?> <resource-lists 
> xmlns="urn:ietf:params:xml:ns:resource-lists">
>   <list name="friends">
>     <entry uri="sip:john at differitas.com">
>       <display-name>John</display-name>
>     </entry>
>     <entry uri="sip:david at differitas.com">
>       <display-name xmlns="">David</display-name>
>     </entry>
>   </list>
> </resource-lists>
> 
> JDOM sees that the new <entry> element is inheriting the namespace of 
> its parent, but now places an xmlns="" in the <display-name> child 
> element.
> 
> The final document is non-conformant with an XML schema. My problem is 
> that the element being inserted is reconstructed from an I/O stream. 
> I'm not building it from scratch, and so therefore have no control 
> over the attached namespaces. This example is trivial - typically, I 
> want to add complex elements, several levels deep. How do I do this? 
> Do I need to iterate through the entire incoming element, to attach 
> the parent's default namespace to EVERY child? I must have 
> mis-understood something. Any help in this matter would be greatly 
> appreciated. Apologies for the length of this mail.
> 
> Best regards,
> 
> David Lang
> 
> 
> _______________________________________________
> To control your jdom-interest membership:
> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.co
> m
> 
> _______________________________________________
> To control your jdom-interest membership:
> http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.co
> m
> 
_______________________________________________
To control your jdom-interest membership:
http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com




More information about the jdom-interest mailing list