Problemas com XML usando StAX

1 resposta
L

Estou usando StAX para fazer a leitura de um XML e criar um objeto com os dados nele contidos. Depois preciso validar cada um desses objetos e persisti-los numa base de dados caso sejam validos e descarta-los, gerando um log do erro encontrado caso a validacao (feita contra um xsd) falhe.
Criei o seguinte xml de exemplo para teste:


Fulano
da Silva

11
123456


Meu código para leirura desse xml é o seguinte:

public class TestStAX {     
	public void readConfig(String fileName) {
		int count = 0;
		try {
			FileInputStream fileInputStream = new FileInputStream(fileName);
			XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream);
			while (xmlStreamReader.hasNext()) {
				int eventCode = xmlStreamReader.next();
				switch (eventCode) {
				case XMLStreamConstants.START_ELEMENT :
					System.out.println("event = START_ELEMENT");
					System.out.println("Localname = "+xmlStreamReader.getLocalName());
					break;
				case XMLStreamConstants.END_ELEMENT :
					System.out.println("event = END_ELEMENT");
					System.out.println("Localname = "+xmlStreamReader.getLocalName());
					if(xmlStreamReader.getLocalName().equals("Person")){
						System.out.println("Fim do objeto");
						count++;
					}
					
					break;
				case XMLStreamConstants.CHARACTERS :
					if((!xmlStreamReader.getText().trim().equals(""))){
						System.out.println("event = CHARACTERS");
						System.out.println("Value = "+xmlStreamReader.getText());
						break;
					}
				}
				xmlStreamReader.close();
			}
			System.out.println("Objetos criados = "+count);

		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	public static void main(String args[]) {
		TestStAX read = new TestStAX();
		read.readConfig("C:/person.xml");
	}
}

ou seja, a cada par eu tenho um objeto. Até ai tudo bem.
A minha duvida é a seguinte: como faço para construir meu objeto com as tags que ja foram lidas (por exemplo, li , ,… e ai eu sei que tenho um objeto completo. Portanto, preciso fazer meu person.setFirstName, person.setLastName, etc… só que, como o StAX é orientado a eventos, eu não perco esses eventos depois de ler cada um deles? Como faco para armazena-los e criar o objeto?
Além disso, preciso verificar a consistencia do arquivo contra um xsd. Caso um par apresente problemas,devo logar o erro e a linha onde ocorreu. Nesse caso, o objeto não precisa ser instanciado.
É possível fazer essa validação contra um xsd usando StAX?

Se alguém já tiver passado por uma situação semelhante, ou tiver alguma idéia, poderia me ajudar?

1 Resposta

T

Quanto à validação, um StAXSource pode ser passado para um Validator.

http://java.sun.com/javase/6/docs/api/javax/xml/validation/Validator.html
http://java.sun.com/javase/6/docs/api/javax/xml/transform/stax/StAXSource.html

Criado 20 de agosto de 2008
Ultima resposta 21 de ago. de 2008
Respostas 1
Participantes 2