[jdom-interest] Empty xmlns in reconstructed XML

David M. Lang david at proxsys.co.uk
Thu Aug 17 08:10:18 PDT 2006


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