|
Thanks Michael for this excellent explanation. I have a use case that is a bit special and I am not sure if this is a Xerces or a JDOM problem.
I create a JDOM with all nodes in NO_NAMESPACE (structure is defined by customer). This JDOM is subsequently converted to a Xerces DOM with the JDOM's DOMOutputter. This would use Document.createElement instead of Document.createElementNS to create the Elements for example as I use NO_NAMESPACE. This way I always get a DOM without namespace support. Now I want to validate this DOM against a schema (provided by the customer). The schema does not declare a target namespace. And the XML files reference it with noNamespaceSchemaLocation. This seems legal to me. But with no namespace support in the DOM I can not use the schema validation due to this issue. Would it be possible to use createElementNS instead here, even though I have no namespace? Then it can be solved in JDOM's DOMOutputter. If not, then you should think about how to validate a DOM with no namespace :-) Makes sense. I agree with your viewpoint of failing fast instead of attempting to fix up the input.
I think users would benefit from an IllegalArgumentException being thrown here. The "Cannot find the declaration of element" exception fails to convey that the user provided a bad input. Thanks for your response. Ortwin,
Yes. Unless you're writing a pure non-namespace-aware application [1] (which doesn't interact with namespace-aware processing models: XML schema, XSLT, XPath, XInclude, etc...), you should never use the DOM Level 1 methods: createElement/createAttribute. To create a namespace-aware element node with no namespace, you would call createElementNS(null, <<ELEMENT_NAME>>) [2]. [1] http://www.w3.org/DOM/faq.html#create [2] http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-DocCrElNS Steven, I agree. This error message is particuarly misleading because it uses the tag name as the replacement parameter instead of the local name which is null. I plan to change the schema validator so that it checks for null local names and reports an error for this malformed input. Thanks Michael. Passing the problem on to JDOM. People experiencing the problem can find a JDOM patch here: http://www.odi.ch/weblog/posting.php?posting=301
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Each of the element/attribute nodes in a DOM built from a non-namespace-aware parser will have a null [4] local name. Note that [local name] is a required [2] property for both element and attribute information items. Validation of an input which is missing required infoset properties is undefined. This only "works" with Java 5.0 because it is attempting to fix-up the input, quite likely trying to make sense of documents which are not conformant [5] to the namespaces specification. I don't think this is something Xerces should be doing. You wouldn't want a compiler to try fixing syntax errors in source code by guessing what you meant. What happens when it's wrong? In order for the validator to behave predictably, you must provide it with an input constructed by a namespace-aware parser (i.e. factory.setNamespaceAware(true)).
[1] http://xerces.apache.org/xerces2-j/javadocs/api/javax/xml/transform/dom/DOMSource.html
[2] http://www.w3.org/TR/xmlschema-1/#infoset
[3] http://www.w3.org/TR/xmlschema-1/#concepts-data-model
[4] http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-2141741547
[5] http://www.w3.org/TR/REC-xml-names/#Conformance