XML Schema

2 respostas
gcobr

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?

2 Respostas

T

Hum, não sei se isto aqui está certo:

<?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"
     elementFormDefault="qualified">  
     <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>
<?xml version="1.0" encoding="UTF-8"?>  
<PessoaFisica  
    xsi:type="xsd:PessoaFisica"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://dominio.com/xsd Basic.xsd">  
    <nome>Gabriel Oliveira</nome>  
    <telefone>36589236</telefone>  
    <cpf>[telefone removido]</cpf>  
</PessoaFisica>
gcobr
thingol:
Hum, não sei se isto aqui está certo:
<?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"
     elementFormDefault="qualified">  
     <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>
<?xml version="1.0" encoding="UTF-8"?>  
<PessoaFisica  
    xsi:type="xsd:PessoaFisica"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://dominio.com/xsd Basic.xsd">  
    <nome>Gabriel Oliveira</nome>  
    <telefone>36589236</telefone>  
    <cpf>[telefone removido]</cpf>  
</PessoaFisica>

Infelizmente não. Testei e não fez a menor diferença.

Eu acho que existe um problema lógico no XSD. Mas ainda não domino suficientemente o assunto.

Criado 10 de fevereiro de 2009
Ultima resposta 10 de fev. de 2009
Respostas 2
Participantes 2