[jdom-interest] Empty xmlns in reconstructed XML

Jason Hunter jhunter at servlets.com
Thu Aug 17 13:05:41 PDT 2006


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.com
> 
> _______________________________________________
> 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