Validar XML do CT-e usando o Xerces

0 respostas
javer

Pessoal, preciso validar o XML com o .XSD, acontece que o XSD tem dependências de outros dentro dele.

Preciso que seja validado dentro da aplicação sem referenciar recursos externos.

Segue meu código que não está funcionando porque não encontra o elemento "enviCTe", lembrando que o mesmo XML quando validado usando os caminhos absolutos para o .XSD na pasta local o XML é validado corretamente.

O problema todo está em chamar os XSD dentro da aplicação mesmo:

public List<String> validarEnvio(String xml) throws SAXException, IOException  {
		erros = new ArrayList<String>();

		FacesContext context = FacesContext.getCurrentInstance();
		URL urlLocalSchemaEnvio = context.getExternalContext().getResource("//resources//xsd//enviCTe_v2.00.xsd");
		URL urlLocalSchemaTiposBasicos = context.getExternalContext().getResource("//resources//xsd//cteTiposBasico_v2.00.xsd");
		URL urlLocalSchemaTipoGeral = context.getExternalContext().getResource("//resources//xsd//tiposGeralCTe_v2.00.xsd");
		
		xml = normalizeXML(xml);
		InputStream isXML = new ByteArrayInputStream(xml.getBytes());

		SAXParser parser =  new SAXParser();
		ValidatorErroHandler handler = new ValidatorErroHandler();

		// jndi:/default-host/pstransp/resources/xsd/enviCTe_v2.00.xsd
		String strLocalSchemaEnvio = urlLocalSchemaEnvio.toExternalForm();
		
		// para mostrar os erros de validação
		parser.setFeature("http://xml.org/sax/features/validation", true);

		// para validar usando um schema
		parser.setFeature("http://apache.org/xml/features/validation/schema", true);

		// para verificar todos os schemas
		parser.setFeature("http://apache.org/xml/features/validation/schema-full-checking", true);

		parser.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation", strLocalSchemaEnvio);

		// habilita o manipulador de erros
		parser.setErrorHandler(handler);

		parser.parse(new InputSource(isXML));

		return erros;
	}
Erro: cvc-elt.1.a: Cannot find the declaration of element 'enviCTe'.

Pelo que li mesmo havendo dependências entre os XSD eu deveria passar apenas o principal.

O SAXParser utilizado lá é do Xerces 2.11

Alguém pode dar alguma dica sobre isso?

Criado 24 de junho de 2014
Respostas 0
Participantes 1