[jdom-interest] Empty xmlns in reconstructed XML

David M. Lang david at proxsys.co.uk
Thu Aug 17 09:51:04 PDT 2006


 
Hi Justin,

	Thanks again for the response. To repeat, the primary document is
read from the file system. I was just using a shorthand annotation (...) to
simplify the description. In full :-

File file = new File("location");
FileInputStream fis = new FileInputStream(file);
Document primary = new Document(fis);
etc, etc

Anyway, this isn't the relevant bit. I would regard iterating over ALL
elements in a complex multi-level secondary document, assigning a namespace
to each as hugely inefficient. I don't see how this could be deemed
otherwise. As I pointed out in my original mail, the example shown was
grossly simplified for purposes of illustratation. I'm sure there's a better
way - I just must be missing something. BTW, this is an XCAP server
application (Rosenberg), which doesn't mandate that incoming XML has the
default namespace attached. 

Regards,

David

-----Original Message-----
From: Edelson, Justin [mailto:Justin.Edelson at mtvn.com] 
Sent: 17 August 2006 17:13
To: David M. Lang; jdom-interest at jdom.org
Cc: john.sletten at netcom.no
Subject: RE: [jdom-interest] Empty xmlns in reconstructed XML

> 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




More information about the jdom-interest mailing list