[jdom-interest] Empty xmlns in reconstructed XML

Edelson, Justin Justin.Edelson at mtvn.com
Thu Aug 17 11:16:42 PDT 2006


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

One thing you might want to look at is using an org.xml.sax.XMLFilter to
modify the stream of SAX events to specify a namespace URI where there
is none. But that assumes you're using SAXBuilder and don't need the
no-namespace versions of the Elements for any other purpose. I suspect
you would consider this to be less "hugely inefficient" than walking the
descendent tree.




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


 
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


_______________________________________________
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