Não sei se isso deveria ser postado aqui ou em Java Avançado. Acho que aqui é um bom lugar, pois o tópico não está diretamente relacionado a Java.
Suponham o seguinte XML Schema:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:obj="http://dominio.com/xsd"
targetNamespace="http://dominio.com/xsd">
<xs:complexType name="Pessoa">
<xs:sequence>
<xs:element name="nome" type="xs:string"/>
<xs:element name="telefone" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="PessoaFisica">
<xs:complexContent>
<xs:extension base="obj:Pessoa">
<xs:sequence>
<xs:element name="cpf" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
E o seguinte documento XML de instância:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:PessoaFisica
xsi:type="xsd:PessoaFisica"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://dominio.com/xsd" >
<nome>Gabriel Oliveira</nome>
<telefone>36589236</telefone>
<cpf>[telefone removido]</cpf>
</xsd:PessoaFisica>
Se eu tentar validar com:
InputStream xml = UmaClasse.class.getResourceAsStream("/Simple.xml");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
InputStream xsd = UmaClasse.class.getResourceAsStream("/Basic.xsd");
Schema schema = factory.newSchema(new StreamSource(xsd));
Validator v = schema.newValidator();
v.validate(new StreamSource(xml));
A validação gera o erro:
org.xml.sax.SAXParseException: cvc-elt.4.2: Cannot resolve 'xsd:PessoaFisica' to a type definition for element 'xsd:PessoaFisica'.
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:410)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3165)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.getAndCheckXsiType(XMLSchemaValidator.java:2467)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1922)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:685)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3095)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.jaxp.validation.StreamValidatorHelper.validate(StreamValidatorHelper.java:144)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:107)
at javax.xml.validation.Validator.validate(Validator.java:127)
Alguém sabe apontar o que está errado no XSD ou no XML?