[jdom-interest] Namespace patch

Elliotte Rusty Harold elharo at metalab.unc.edu
Tue Aug 29 13:40:21 PDT 2000

At 2:33 PM -0500 8/29/00, Brett McLaughlin wrote:

>Right. Originally, we had things this way - addNamespaceDeclaration()
>and so forth. And though it was a bit different, we came up with the
>notion (which I still agree with) that an Element needs to know its
>namespace declaration, because it's intrinsic to what the Element
>actually is. But that aside, I'm not objectionable to an Element holding
>onto other declarations; the hardest thing becomes what happens to an
>Element being added, presumably one in the "Default" namespace, to an
>Element with a default namespace declaration. Currently, it does what I
>consider the right thing; only an Element with a Namespace has a
>Namespace, and no "magic" happens behind the back of the user; but with
>this proposed change, that isn't so obvious.

We could certainly require that every namespace declaration added 
through addNamespaceDeclaration() contain a prefix. I don't see the 
use case where we'd want to use addNamespaceDeclaration() to change 
the default namespace. If somebody tried to do that by passing the 
empty string as a prefix, we could just throw an exception.

Similarly, if somebody tried to add a namespace declaration that 
remapped the prefix on the element or one of its attributes, we'd 
throw an exception.

Trickier question: someone adds an attribute that uses the same 
prefix but a different URI than the one the element itself uses. We 
should probably throw an exception there too.

But what we're really struggling with is the idea that Attribute 
values have namespace prefixes. Therefore maybe we're approaching 
this wrong by focusing on the namespace declarations. Maybe what we 
need is a way to associate a URI with an attribute value. Suppose we 
added an extra field to the Attribute class:

   private Namespace valueNS = null;

We'd add the extra methods necessary to set this and so forth. Since 
attribute values can contain colons for reasons completely unrelated 
to namespaces, we'd only require the namespaceURI be passed to the 
method signatures, not the prefixes which would be passed as part of 
the normal value. For example,

public Attribute(java.lang.String name,
                  java.lang.String prefix,
                  java.lang.String uri,
                  java.lang.String value,  // this includes the prefix
                  java.lang.String valueNS)

public String getValueURI()
public String getValuePrefix()

Existing methods and code that ignored namespaces in attribute values 
would behave the same. Then the XMLOutputter could make sure that 
there was no undeclared prefix in an attribute value.

This seems to me that it would work very well for documents built 
from scratch. However, there might be problems when a document was 
read from a stream since parsers don't report namespace bindings for 
attribute values. Still I think this is surmountable. We'd check each 
attribute value to see if it appeared to contain an in-scope 
namespace prefix mapped to a URI. If so we'd set the URI. Otherwise 
we'd just leave it null.  At worst we'd just have some extra 
namespace mappings floating around that could be ignored by anybody 
who wasn't interested in them. They wouldn't affect anything JDOM 
did, except maybe where the outputters put the xmlns declarations. 
They'd just be there in case client programmers wanted them.

Overall this seems a little more in line with the JDOM design to me. Thoughts?

| Elliotte Rusty Harold | elharo at metalab.unc.edu | Writer/Programmer |
|                  The XML Bible (IDG Books, 1999)                   |
|              http://metalab.unc.edu/xml/books/bible/               |
|   http://www.amazon.com/exec/obidos/ISBN=0764532367/cafeaulaitA/   |
|  Read Cafe au Lait for Java News:  http://metalab.unc.edu/javafaq/ |
|  Read Cafe con Leche for XML News: http://metalab.unc.edu/xml/     |

More information about the jdom-interest mailing list