Tenho o seguinte XML:
<?xml version="1.0" encoding="UTF-8"?>
<carro>
<nome>Fusca</nome>
<portas>2</portas>
<motoristas>
<motorista>
<nome>Guilherme</nome>
</motorista>
<motorista>
<nome>Leonardo</nome>
</motorista>
</motoristas>
</carro>
e o seguinte XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="carro" type="Carro" />
<xsd:complexType name="Carro">
<xsd:sequence>
<xsd:element name="nome" type="xsd:string" minOccurs="1"
maxOccurs="1" nillable="false"/>
<xsd:element name="portas" type="xsd:int" minOccurs="1"
maxOccurs="1" nillable="false"/>
<xsd:element name="motoristas" type="Motorista" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Motorista">
<xsd:sequence>
<xsd:element name="nome" minOccurs="1" maxOccurs="1"
type="xsd:string" nillable="false"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Faço a validação assim:
public class Validador {
public void valida(File xml, File xsd) throws Exception {
Source schemaFile = new StreamSource(xsd);
Source xmlFile = new StreamSource(xml);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(xmlFile);
}
}
Validador validador = new Validador();
try {
validador.valida(new File("C:\\Users\\User\\Desktop\\xml\\xml.xml"),
new File("C:\\Users\\User\\Desktop\\xml\\xsd.xsd"));
} catch (Exception ex) {
Logger.getLogger(TesteXML.class.getName()).log(Level.SEVERE, null, ex);
}
Dá o seguinte erro:
org.xml.sax.SAXParseException; systemId: file:/C:/Users/Rodrigo/Desktop/xml/xml.xml; lineNumber: 6; columnNumber: 16; cvc-complex-type.2.4.a: Foi detectado um conteúdo inválido começando com o elemento 'motorista'. Era esperado um dos '{nome}'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:437)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:325)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:458)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3237)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1796)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:746)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:379)
Logo depois da tag <motoristas>
ele espera uma tag <nome>
, mas quero inserir uma lista de motoristas e não apenas um motorista, preciso mudar o xsd para aceitar uma lista de acordo com meu xml?