You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-dev@xerces.apache.org by "Michael Glavassevich (JIRA)" <xe...@xml.apache.org> on 2006/05/23 07:37:19 UTC
[jira] Resolved: (XERCESJ-1163)
javax.xml.validation.Validator#validate implementation does not support a
DOMSource argument
[ http://issues.apache.org/jira/browse/XERCESJ-1163?page=all ]
Michael Glavassevich resolved XERCESJ-1163:
-------------------------------------------
Resolution: Won't Fix
There is a warning in the Javadoc for DOMSource [1] which says: "Note that XSLT requires namespace support. Attempting to transform a DOM that was not constructed with a namespace-aware parser may result in errors. Parsers can be made namespace aware by calling DocumentBuilderFactory.setNamespaceAware(boolean awareness)." The same applies to XML schema validation which also requires namespace support. Schema validation is only defined for XML documents which have an infoset [2][3]. This implies both well-formedness and namespace conformance, the second of which is not checked by a non-namespace-aware parser.
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
> javax.xml.validation.Validator#validate implementation does not support a DOMSource argument
> --------------------------------------------------------------------------------------------
>
> Key: XERCESJ-1163
> URL: http://issues.apache.org/jira/browse/XERCESJ-1163
> Project: Xerces2-J
> Type: Bug
> Components: JAXP (javax.xml.validation)
> Versions: 2.8.0
> Reporter: Steven Grossman
>
> Validator#validate implementation does not support a DOMSource argument. The following SAXParseException is always thrown:
> Exception in thread "main" org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'xxx'.
> The problem is not seen in the 1.5 jdk.
> I've supplied a test class that succesfully validates an xml instance document using a StreamSource and subsequently fails to perform the validation against a DOMSource representation of the same xml.
> import java.io.StringReader;
> import java.io.IOException;
> import javax.xml.XMLConstants;
> import javax.xml.parsers.DocumentBuilder;
> import javax.xml.parsers.DocumentBuilderFactory;
> import javax.xml.parsers.ParserConfigurationException;
> import javax.xml.transform.stream.StreamSource;
> import javax.xml.transform.dom.DOMSource;
> import javax.xml.validation.Schema;
> import javax.xml.validation.SchemaFactory;
> import javax.xml.validation.Validator;
> import org.xml.sax.SAXException;
> import org.xml.sax.InputSource;
> import org.w3c.dom.Document;
> public final class ValidatorBug {
> private static final String SCHEMA =
> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
> "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\">\n" +
> " <xs:element name=\"root\"/>\n" +
> "</xs:schema>";
> private static final String XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root/>";
> public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
> SchemaFactory schemaFactory =
> SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
> Schema schema = schemaFactory.newSchema(new StreamSource(new StringReader(SCHEMA)));
> Validator validator = schema.newValidator();
> System.out.println("\nvalidating stream source");
> validator.validate(new StreamSource(new StringReader(XML))); // <--- WORKS
> System.out.println("valid");
> DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
> DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
> Document document = documentBuilder.parse(new InputSource(new StringReader(XML)));
> System.out.println("\nvalidating DOM source");
> validator.validate(new DOMSource(document)); // <--- PROBLEM
> System.out.println("valid");
> }
> }
> The exception:
> Exception in thread "main" org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'root'.
> at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
> at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
> at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
> at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
> at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
> at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
> at org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
> at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
> at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
> at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
> at javax.xml.validation.Validator.validate(Validator.java:82)
> at ValidatorBug.main(ValidatorBug.java:42)
> (This bug is represented by XERCESJ-1132 and XERCESJ-1161, but they were in the wrong component)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: j-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-dev-help@xerces.apache.org