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?