I'm finding the following problem quite intractable (OK, that's an
understatement) - any insights will be appreciated.

I've been validating in memory XML created from dom4j 'new
DOMDocument()' - but this will not work with Java 6.

The following call to validate(source) of a dom4j (1.6.1) DOMSource
works with Java 1.5.x but fails with Java 1.6.x:

        public void validate() throws Exception {
                SchemaFactory schemaFactory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
                schemaFactory.setErrorHandler(null);
                Schema schemaXSD = schemaFactory.newSchema(new 
URL(getSchemaURLString()));
                Validator validator = schemaXSD.newValidator();
                DOMSource source = new DOMSource(getDocument());
                validator.validate(source);
        }
        
getSchemaURLString() is also used to add the
xsi:noNamespaceSchemaLocation attribute to the root node, i.e.:
xsi:noNamespaceSchemaLocation="http://localhost:8080/integration/xsd/fqlResponseSchema-2.0.xsd";

The exception follows:

Exception:  org.xml.sax.SAXParseException: cvc-complex-type.3.2.2:
Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in
element 'specialfields'.; complex-type.3.2.2: Attribute
'xsi:noNamespaceSchemaLocation' is not allowed to appear in element
'specialfields'.
        at 
com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
        at 
com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
        at 
com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
        at 
com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
        at 
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:417)
        at 
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3182)
        at 
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processAttributes(XMLSchemaValidator.java:2659)
        at 
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:2066)
        at 
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:705)
        at 
com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.beginNode(DOMValidatorHelper.java:273)
        at 
com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:240)
        at 
com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:186)
        at 
com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:104)
        at javax.xml.validation.Validator.validate(Validator.java:127)


Here's the start of the XML - generated after disabling the call to
validator.validate(source):

<?xml version="1.0" encoding="utf-8"?>
<meetings 
xsi:noNamespaceSchemaLocation="http://localhost:8080/integration/xsd/fqlResponseSchema-2.0.xsd";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
.............
</meetings>

And of the XSD:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
elementFormDefault="qualified">
  <xs:element name="meetings">
    <xs:complexType>
      <xs:choice>
            <xs:sequence>
              <xs:element minOccurs="0" maxOccurs="1" ref="summary" />
              <xs:element minOccurs="0" maxOccurs="unbounded" ref="meeting" />
            </xs:sequence>
        <xs:element ref="error" />
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:element name="summary">
................


So my root element is being rejected because it contains a
xsi:noNamespaceSchemaLocation attribute.  And the schema itself does
not specify that as a valid attribute of my root element?

At this point it seems to me that I need to give up on dom4j for this
task and switch to one of the other solutions, for example as outlined
here:

But I'd like to know what I've done wrong at any rate!

Thanks in advance.

Andy Newton

------------------------------------------------------------------------------
Index, Search & Analyze Logs and other IT data in Real-Time with Splunk 
Collect, index and harness all the fast moving IT data generated by your 
applications, servers and devices whether physical, virtual or in the cloud.
Deliver compliance at lower cost and gain new business insights. 
Free Software Download: http://p.sf.net/sfu/splunk-dev2dev
_______________________________________________
dom4j-user mailing list
dom4j-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dom4j-user

Reply via email to