[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


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

> 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