Analisando um arquivo XML usando StAX

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.