[jdom-interest] Empty xmlns in reconstructed XML

Edelson, Justin Justin.Edelson at mtvn.com
Thu Aug 17 09:12:48 PDT 2006


> Document primary = new Document(...);       // The primary document is
read
> from the file system 
You say it's read from the filesystem, but this code is creating a new
Document.

> 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.
If the elements from the secondary document are not in a namespace and
you need them to be in a namespace, then yes, you need to assign the
namespace to each element. You are changing the namespace of each
element which requires a call to setNamepsace()

> But this is hugely inefficient.
Is it? From what perspective?

Just a thought, but why aren't the elements in the secondary document in
the correct namespace? That seems to be the root of your problem.




-----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 11:10 AM
To: jdom-interest at jdom.org
Cc: john.sletten at netcom.no
Subject: RE: [jdom-interest] Empty xmlns in reconstructed XML

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


_______________________________________________
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