[jdom-interest] Namespace inheritance after cloning

Jason Hunter jhunter at xquery.com
Sat Nov 27 22:40:54 PST 2004


Alistair Young wrote:

> I have a strange problem. I've read the archives and the FAQ and
> understand the non inheritance of prefix:local style namespaces. However,
> when I do:
> 
> Document root =
> <root xmlns="http://test.ns">
> </root>
> 
> Document next =
> <next>some text</next>
> 
> root.getRootElement().addContent((Content)next.getRootElement().clone());
> 
> I get:
> <root xmlns="http://test.ns">
>   <next xmlns="">some text</next>
> </root>
> 
> and it breaks the XML schema validation! <next> should obviously be in the
> test.ns namespace. JDOM seems to want to put it in an empty namespace.

The <next> you created is in no namespace.  When you move it to another 
document, the element doesn't change namespaces.  Namespaces are an 
intrinsic part of each Element and don't depend on placement.  So on 
output JDOM has to make sure that the default namespace on <root> 
doesn't mistakenly apply to <next> so it writes xmlns="" which reassigns 
the default namespace for that context to no namespace.  JDOM's 
correctly serializing the XML data model as you created it.

> Now, the weird thing is, if I create <next> with the same namespace as
> <root>, JDOM still replaces it with xmlns="".

That's not something JDOM would do.  I suspect your code isn't actually 
doing what you describe here.  :)  If you can't figure it out, send in a 
simple code sample showing the issue and we'll see if it's any real bug.

> If <root> doesn't have a namespace, then the xmlns="" isn't added to <next>.
> Nowhere in the code is xmlns="" generated when creating the <next> Element.

Right, because there's no need to redefine the default namespace when 
there's no default namespace in effect.

-jh-



More information about the jdom-interest mailing list