Analisando um arquivo XML usando StAX
1. Introdução
Neste tutorial, ilustraremos como analisar um arquivo XML usando StAX. Vamos implementar um analisador XML simples e ver como ele funciona com um exemplo.
2. Analisando com StAX
StAX é um dos váriosXML libraries in Java. It’s a memory-efficient library included in the JDK since Java 6. StAX não carrega todo o XML na memória. Em vez disso, ele extrai dados de um fluxo apenas de maneira direta. O fluxo é lido por um objetoXMLEventReader.
3. ClasseXMLEventReader
No StAX, qualquer tag inicial ou final é um evento. XMLEventReader reads an XML file as a stream of events. Ele também fornece os métodos necessários para analisar o XML. Os métodos mais importantes são:
-
isStartElement(): verifica se o evento atual é umStartElement (tag inicial)
-
isEndElement(): verifica se o evento atual é umEndElement (tag final)
-
asCharacters(): retorna o evento atual como caracteres
-
getName(): obtém o nome do evento atual
-
getAttributes(): retorna umIterator dos atributos do evento atual
4. Implementando um Analisador XML Simples
Escusado será dizer que o primeiro passo para analisar um XML é lê-lo. Precisamos de umXMLInputFactory para criar umXMLEventReader para ler nosso arquivo:
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream(path));
Agora que oXMLEventReader está pronto, avançamos no fluxo comnextEvent():
while (reader.hasNext()) {
XMLEvent nextEvent = reader.nextEvent();
}
Em seguida, primeiro precisamos encontrar nossa tag de início desejada:
if (nextEvent.isStartElement()) {
StartElement startElement = nextEvent.asStartElement();
if (startElement.getName().getLocalPart().equals("desired")) {
//...
}
}
Conseqüentemente, podemos ler os atributos e dados:
String url = startElement.getAttributeByName(new QName("url")).getValue();
String name = nextEvent.asCharacters().getData();
Também podemos verificar se alcançamos uma tag final:
if (nextEvent.isEndElement()) {
EndElement endElement = nextEvent.asEndElement();
}
5. Exemplo de análise
Para entender melhor, vamos executar nosso analisador em um arquivo XML de amostra:
example
Online Courses
Online
Example
Examples
Offline
Localhost
Tests
Offline
Vamos analisar o XML e armazenar todos os dados em uma lista de objetos de entidade chamadawebsites:
while (reader.hasNext()) {
XMLEvent nextEvent = reader.nextEvent();
if (nextEvent.isStartElement()) {
StartElement startElement = nextEvent.asStartElement();
switch (startElement.getName().getLocalPart()) {
case "website":
website = new WebSite();
Attribute url = startElement.getAttributeByName(new QName("url"));
if (url != null) {
website.setUrl(url.getValue());
}
break;
case "name":
nextEvent = reader.nextEvent();
website.setName(nextEvent.asCharacters().getData());
break;
case "category":
nextEvent = reader.nextEvent();
website.setCategory(nextEvent.asCharacters().getData());
break;
case "status":
nextEvent = reader.nextEvent();
website.setStatus(nextEvent.asCharacters().getData());
break;
}
}
if (nextEvent.isEndElement()) {
EndElement endElement = nextEvent.asEndElement();
if (endElement.getName().getLocalPart().equals("website")) {
websites.add(website);
}
}
}
Para obter todas as propriedades de cada site, verificamosstartElement.getName().getLocalPart() para cada evento. Em seguida, configuramos a propriedade correspondente de acordo.
Quando alcançamos o elemento final do site, sabemos que nossa entidade está completa, então adicionamos a entidade à nossa listawebsites.
6. Conclusão
Neste tutorial, aprendemoshow to parse an XML file using StAX library.
O arquivo XML de exemplo e o código do analisador completo estão disponíveis, como sempre,over on Github.