[jdom-interest] Empty xmlns in reconstructed XML
Jason Hunter
jhunter at servlets.com
Thu Aug 17 13:05:41 PDT 2006
Probably easier, you could also use a custom JDOMFactory so during the
build each element was placed into the proper namespace from the get-go.
The fundamental issue is you're building a document with elements in
NO_NAMESPACE, adding them to a document with a namespace, and wanting
the NO_NAMESPACE to vanish, but NO_NAMESPACE is as much a namespace as
any other. If you include an xhtml table in a furniture store document,
it doesn't become a furniture table.
-jh-
Edelson, Justin wrote:
>> 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
>
> _______________________________________________
> 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