[jdom-interest] Empty xmlns in reconstructed XML

Edelson, Justin Justin.Edelson at mtvn.com
Thu Aug 17 06:42:26 PDT 2006


> 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); 

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?

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

> 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?
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



More information about the jdom-interest mailing list