[jdom-interest] Namespace inheritance after cloning

Alistair Young alistair at smo.uhi.ac.uk
Sun Nov 28 15:05:10 PST 2004

It's like was mentioned on this list - I fell into this trap too. I was
treating the JDOM cloning/adding content as I would treat copy/paste of
serialised XML document elements into other documents.
If you're using namespaces, you're probably coding to a schema, so you'll
know what ones to use.
Once you realise that XML is more than what you see in serialised form, it
all falls into place!

Alistair Young
Senior Software Engineer
UHI at Sabhal Mòr Ostaig
Isle of Skye

> Hi,
> I've been harbouring (spelling?) an idea where there were two distinct
> modes of Element/Attribute creation. One namespace unaware, in which it
> would be
> impossible to create Elements in any namespace but NO_NAMESPACE; and one
> namespace aware mode, where it would be impossible to create Elements
> without
> explicitly declaring their namespace. Lot's of headaches would be
> alleviated.
> Not sure how to solve it though, except a Design Rule: When dealing with
> namespaces, ALWAYS use the namespace enabled constructors.
> /pmn
> Jason Hunter wrote:
>> 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-
>> _______________________________________________
>> 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