Manipulando XML com JSTL e XPath

 

Olá pessoal!

 

Neste artigo daremos uma breve introdução sobre um assunto pouco abordado, porém de grande utilidade quando nos deparamos com situações onde temos que manipular informações que estão em arquivos XML.

 

Tomemos como ponto de partida o XML abaixo:

 

            <?xml version="1.0"?>

            <carrinho>

                <item id="100">

                    <preco>23.00</preco>

                    <quantidade>3</quantidade>

                </item>

                <item id="25">

                    <preco>2.00</preco>

                    <quantidade>3</quantidade>

                </item>

                <item id="33">

                    <preco>12.00</preco>

                    <quantidade>3</quantidade>

                </item>                   

            </carrinho>

 

Para tornar nosso artigo mais interessante imaginem que esse é um arquivo gerado por um sistema feito em .Net. Considerando que a nossa fábrica trabalha exclusivamente com Java e temos que interagir com esse sistema então o que fazer? Fomos contratados para fazer uma tela para exibição dos dados deste carrinho.

 

Várias idéias vão surgindo como: fazer uma parser utilizando DOM (Document Object Model) ou SAX (Simple API for XML). Esperem, será que ouvi alguém dizer: “Podemos utilizar JSTL?”. Claro que sim, pessoal! A JSTL possui uma extensão exclusiva para trabalharmos com XML.

 

O que vem a cabeça quando falamos em JSTL?  Aposto que todos devem ter pensado em Expression Language. Porém, a extensão da
JSTL que trabalha com XML não utiliza a EL, ao invés disso, utiliza instruções XPath.

 

Com o XPath podemos navegar por um documento XML de forma muito simples.

          

Por exemplo, que tal sabermos o preço do item com o atributo id igual a 25?

 

Vejamos a expressão XPath:

/carrinho/item[@id=25]/preço

 

E que tal sabermos a quantidade de itens em nosso carrinho?

count($dados//item)

 

Vamos ver isso funcionando na prática? Observem a nossa página JSP:

 

<%@page contentType="text/html"%>

<%@page pageEncoding="UTF-8"%>

<%@taglib  prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%--

    Extensão da JSTL responsável por manipular XML.

--%>

<%@taglib  prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

 

<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>Manipulando XML</title>

    </head>

    <body>

        <%--

            Para fins didáticos o nosso XML está sendo criado na própria página.

            Em uma aplicação real esse XML seria gerado em tempo de execução por uma aplicação.

            Com isso, ao invés de utilizarmos o <c:set /> faríamos:

            <c:import url="<caminho para o seu xml>" var="dadosXML" />

        --%>

        <c:set var="dadosXML">

            <?xml version="1.0"?>

            <carrinho>

                <item id="100">

                    <preco>23.00</preco>

                    <quantidade>3</quantidade>

                </item>

                <item id="25">

                    <preco>2.00</preco>

                    <quantidade>1</quantidade>

                </item>

                <item id="33">

                    <preco>12.00</preco>

                    <quantidade>5</quantidade>

                </item>                   

            </carrinho>

        </c:set>

        <%--

            Faz o parser do nosso XML.

        --%>

        <x:parse doc="${dadosXML}" var="dados" />

        <%--

            Reparem a utilização de instruções XPath no atributo select da tag <x:out />.

      Para ficar mais interessante o id está sendo passado no parâmetro da requisição.

      Ex: http://localhost:8080/pagina.jsp?id=25

        --%>

        <strong>Preço do item 25: </strong><x:out select="$dados/carrinho/item[@id=$param:id]/preco" /><br/>

        <strong>Quantidade de itens: </strong><x:out select="count($dados//item)" />

    </body>

</html>

 

Exibe como resultado:

Preço do item 25: 2.00

Quantidade de itens: 3

 

Vamos fazer a apresentação tabular de nossos dados:

...

        <table border="1">

            <thead>

                <tr>

                    <th colspan="3" align="center">Carrinho</th>

                </tr>

                <tr>

                    <th align="center">ID</th>

                    <th align="center">Quantidade</th>

                    <th align="center">Preço</th>

                </tr>

            </thead>

            <tbody>

                <%--

                    A tag <x:forEach /> está percorrendo todos os itens de nosso carrinho.

                    A tag <x:out /> está usando caminhos relativos para exibir os dados de cada item.

                --%>               

                <x:forEach select="$dados//item">

                    <tr>

                        <td align="center"><x:out select="@id" /></td>

                        <td align="center"><x:out select="quantidade" /></td>

                        <td align="center"><x:out select="preco" /></td>

                    </tr>

                </x:forEach>

            </tbody>

        </table>

...

 

Como resultado:

Carrinho

ID

Quantidade

Preço

100

3

23.00

25

1

2.00

33

5

12.00

 

Conclusões

Vimos como pode ser fácil trabalhar com XML utilizando JSTL. É necessário ter o xalan.jar (ver em referências) no seu CLASSPATH para executar os exemplos.

 

Se o XML ainda não está presente em sua vida de desenvolvedor podem ter certeza que é só uma questão de tempo para isso mudar. O XPath está presente em várias ferramentas e frameworks que têm XML como meio de intercâmbio de dados. O Open Laszlo e o Adobe Flash são exemplos disso.

 

Estudem bastante, pois o XPath é muito poderoso. Possuindo mais de 100 funções, operadores e sintax que juntos fazem coisas que vocês nem imaginam. :)

 

Bons estudos e até a próxima!!!

 

Referências

XPath Tutorial

http://www.w3schools.com/xpath/default.asp

 

JSTL XML

http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/x/tld-summary.html

 

Xalan

http://xml.apache.org/xalan-j/downloads.html

 

XPath

http://www.w3.org/TR/xpath