O documento discute a arquitetura JAXB e como ela permite integrar aplicações Java com XML de forma transparente através do mapeamento entre classes Java e documentos XML. JAXB gera classes Java a partir de esquemas XML e permite serializar e desserializar objetos para XML e vice-versa sem precisar lidar diretamente com a sintaxe XML. O documento também explica conceitos como esquemas XML, tipos de dados, elementos e atributos.
2. argonavis.com.brargonavis.com.braa
bb
xxjj
2
Explorar JAXB: uma arquitetura que permite a
integração transparente de Java e XML
Tópicos abordados
Introdução
Arquitetura JAXB
XML Schema
Mapeamento XML-Java
Como usar JAXB: passo-a-passo
Demonstração
ObjetivosObjetivos
3. argonavis.com.brargonavis.com.braa
bb
xxjj
3
Mapeamento Java - XMLMapeamento Java - XML
● Como integrar aplicações Java com XML?
●
Alternativas tradicionais: APIs nativas – JAXP
– SAX – leitura seqüencial
com captura de eventos
– DOM – montagem de
árvore de elementos na
memória
● Desvantagens:
– Requerem conhecimento
de XML, uso de APIs burocráticas, ...
– Queremos persistência sem precisar ver XML
JAXP
Documento
XML
Estilo
XSLT
Documento
XML / HTML
DOM
SAX
Texto
DOM
4. argonavis.com.brargonavis.com.braa
bb
xxjj
4
O que é “XML data binding”?O que é “XML data binding”?
● Mapeamento entre
– Classe – Esquema XML
– Objeto – Instância (documento) XML
Conta
codigo: String
nome: String
saldo: double
conta_4:Conta
codigo="4"
nome="Morticia"
saldo=82.00
<!ELEMENT conta (codigo, nome, saldo)
<!ELEMENT codigo (#PCDATA)>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT saldo (#PCDATA)>
<conta>
<codigo>4</codigo>
<nome>Morticia</nome>
<saldo>199.35</saldo>
</conta>
<conta>
<codigo>4</codigo>
<nome>Morticia</nome>
<saldo>0</saldo>
</conta>
<conta>
<codigo>4</codigo>
<nome>Morticia</nome>
<saldo>82.00</saldo>
</conta>
conta_4.xml
conta_3.xml
conta_2.xml
conta.dtd
5. argonavis.com.brargonavis.com.braa
bb
xxjj
5
Transparência com XML bindingTransparência com XML binding
● Com XML binding é possível ter persistência de
dados em XML sem precisar conhecer XML
● Separação de responsabilidades: dois processos
separados
– 1. Mapeamento e construção das classes Java derivadas
de um esquema XML – requer a construção e
compilação de um ou mais esquemas XML
– 2. Utilização das classes para serialização de objetos
derivados das classes geradas – não requer nenhum
conhecimento de XML: formato no qual os dados são
guardados
7. argonavis.com.brargonavis.com.braa
bb
xxjj
7
JAXBJAXB
●
Java Architecture for XML Binding
– Parte do Java Web Services Development Pack 1.3/1.4
– Interface genérica para diferentes provedores de serviço
que façam mapeamento XML – Java
– Suporta DTD, XML Schema e outros formatos de
esquema XML
● O que faz
– Mapeia classes Java a documentos XML e gera
JavaBeans a partir de um esquema XML
– Permite serializar objetos para XML e vice-versa,
fazendo validação no processo.
9. argonavis.com.brargonavis.com.braa
bb
xxjj
9
Típico processo JAXBTípico processo JAXB
●
Gerar classes usando o compilador e um XSD
●
Compilar classes geradas e classes da aplicação.
●
Ler arquivos XML (unmarshal), nós DOM, fontes SAX,
etc. e gerar árvore de dados representando os documentos.
Este processo pode ser precedido por uma etapa de
validação do documento em relação ao seu esquema.
●
Processar os dados através das interfaces dos objetos
que representam as instâncias XML usando as classes
geradas.
●
Gravar arquivos XML (marshal). A árvore de dados é
convertida em um ou mais documentos XML. O conteúdo
pode ser validado antes da gravação.
11. argonavis.com.brargonavis.com.braa
bb
xxjj
11
Principais classes e pacotesPrincipais classes e pacotes
●
Pacote javax.xml.bind e dois subpacotes
●
Classes mais importantes
– Unmarshaller – objeto que realiza a leitura de um
arquivo XML e criação de um objeto derivado
– Marshaller – objeto que serializa um objeto em XML
– Validator – objeto usado para validar o documento
XML e/ou os dados
– JAXBContext – abstração usada para gerenciar o
processo de marshalling e unmarshalling. É preciso ter
uma instância deste objeto para obter um Marshaller
ou Unmarshaller.
12. argonavis.com.brargonavis.com.braa
bb
xxjj
12
O qO que é um Esquema XML?ue é um Esquema XML?
O esquema representa uma classe
Os documentos são instâncias
Esquema (universo de
documentos válidos)
Documentos que aderem à
especificação (válidos)
Documento
fora da
especificação
Como definir esquemas:
DTD - Document Type Definition
W3C XML Schema
13. argonavis.com.brargonavis.com.braa
bb
xxjj
13
DTD vs. XML SchemaDTD vs. XML Schema
●
Um esquema é essencial para que haja comunicação
usando XML
– Pode ser estabelecido "informalmente" (via software)
– Uso formal permite validação usando ferramentas
genéricas de manipulação de XML
● Soluções padrão do W3C
DTD XML Schema
<!ELEMENT contato
(nome, email, telefone)>
<!ATTLIST contato
codigo NMTOKEN #REQUIRED>
<xsd:schema
xmlns:xsd=".../XMLSchema">
<xsd:element name="contato">
<xsd:complexType>
<xsd:attribute name="codigo"
use="required">
• É XML, porém mais complexo
• Suporta namespaces
• Permite definição de tipos
• Simples mas não é XML
• Não suporta namespaces
• Limitado quando a tipos de dados
14. argonavis.com.brargonavis.com.braa
bb
xxjj
14
Atributos
Elementos
Um DTDUm DTD
<!ELEMENT astro (imagem*) >
<!ELEMENT imagem EMPTY >
<!ATTLIST imagem href CDATA #REQUIRED >
<!ATTLIST astro id ID #REQUIRED >
<!ATTLIST astro nome CDATA #REQUIRED >
<!ATTLIST astro diametrokm NMTOKEN #IMPLIED >
Tipos de dados simples
(somente para atributos)
Modelo de conteúdo
(tipo de dados complexo)
Atributo sempre
associado a elemento
<astro id="p05" nome="Jupiter">
<imagem href="jup31.jpg" />
<imagem href="jup32.jpg" />
</astro>
Exemplo de documento válido
em relação a este DTD
15. argonavis.com.brargonavis.com.braa
bb
xxjj
15
Um XSD equivalenteUm XSD equivalente
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="astro" type="astroType" />
<xs:element name="imagem" type="imagemType"/>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:attribute name="id" type="xs:ID"/>
<xs:attribute name="nome" type="xs:string"/>
<xs:attribute name="diametrokm" type="xs:decimal"/>
<xs:complexType name="imagemType">
<xs:attribute ref="href" use="required"/>
</xs:complexType>
<xs:complexType name="astroType">
<xs:sequence>
<xs:element ref="imagem" minOccurs="0"/>
</xs:sequence>
<xs:attribute ref="id" use="required"/>
<xs:attribute ref="nome" use="required"/>
<xs:attribute ref="diametrokm"/>
</xs:complexType>
</xs:schema>
Definição de
tipos de dados
Elementos
Atributos
● Esta não é a única forma de construir XML schemas
16. argonavis.com.brargonavis.com.braa
bb
xxjj
16
Fundamentos XML Schema: TiposFundamentos XML Schema: Tipos
● Há duas qualidades de tipos
●
Tipos simples representam tipos de dados básicos
como texto, números, tokens, booleanos
– Fazem parte do namespace do XML Schema (requerem
prefixo associado ao identificador do namespace), por
exemplo: xs:int, xs:string
●
Tipos complexos representam estruturas do
documento como entidades, atributos, etc.
– Podem fazer parte do namespace default do próprio
documento (e não necessitar de prefixo) se definidos
localmente
17. argonavis.com.brargonavis.com.braa
bb
xxjj
17
Tipos simples do XML SchemaTipos simples do XML Schema
anySimpleType
duration dateTime time date gYearMonth gYear gMonth gDay
string
normalizedString
token
language Name NMTOKEN
NCName NMTOKENS
ID IDREF ENTITY
IDREFS ENTITIES
decimal
integernonPositiveInteger nonNegativeInteger
negativeInteger
positiveInteger
long
int
short
byte
unsignedLong
unsignedInt
unsignedShort
unsignedByte
boolean base64binary
hexbinary
float double anyURI QName NOTATION
18. argonavis.com.brargonavis.com.braa
bb
xxjj
18
<element><element>
● Define um elemento
● Deve estar associado a um tipo de dados...
– por referência ...
– ... ou embutido
<xs:complexType name="cometaType">
<xs:attribute name="id" type="xs:ID" use="required"/>
<xs:attribute name="nome" type="xs:string" use="required"/>
<xs:attribute name="planetas" type="xs:IDREFS"/>
</xs:complexType>
<xs:element name="cometa" type="cometaType" />
<xs:element name="cometa">
<xs:complexType>
<xs:attribute name="id" type="xs:ID" use="required"/>
<xs:attribute name="nome" type="xs:string" use="required"/>
<xs:attribute name="planetas" type="xs:IDREFS"/>
</xs:complexType>
</xs:element>
19. argonavis.com.brargonavis.com.braa
bb
xxjj
19
<attribute><attribute>
● Define um atributo
● Pode estar embutido na definição de um tipo ou
globalmente acessível (para reutilização)
<xs:attribute name="raio" type="xs:decimal"/>
<xs:complexType name="sateliteType">
<xs:complexContent>
<xs:extension base="astroType">
<xs:attribute ref="raio" use="required"/>
<xs:attribute name="anoDesc" type="xs:int"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
20. argonavis.com.brargonavis.com.braa
bb
xxjj
20
<complexType><complexType>
● Tipo que pode conter outros elementos ou
atributos
<xs:complexType name="imagemType">
<xs:attribute name="href" type="xs:anyURI"/>
</xs:complexType>
<xs:complexType name="astroType">
<xs:sequence>
<xs:element ref="imagem" minOccurs="0"/>
<xs:element name="satelite" type="sateliteType"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="astroID" use="required"/>
<xs:attribute name="nome" type="xs:token" />
<xs:attribute name="diametrokm" type="xs:decimal"/>
</xs:complexType>
21. argonavis.com.brargonavis.com.braa
bb
xxjj
21
<sequence><sequence>
● Permite definir uma seqüência de elementos
● Equivalente ao modelo de conteúdo (a, b, c) no
DTD
<xs:element name="sistemaEstelar">
<xs:complexType>
<xs:sequence>
<xs:element name="centro" type="centroType"/>
<xs:element name="orbita" type="orbitaType"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="cometa" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Equivale, em DTD, a (centro, orbita*, cometa*)
22. argonavis.com.brargonavis.com.braa
bb
xxjj
22
<choice><choice>
● Permite escolher um elemento de um conjunto
● Equivalente ao modelo de conteúdo (a | b | c) no
DTD
<xs:complexType name="orbitaType">
<xs:choice>
<xs:element name="estrela" type="estrelaType"/>
<xs:element name="planeta" type="sateliteType"/>
<xs:element name="asteroide" type="sateliteType"
minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
<xs:attribute name="raioMedUA" type="xs:decimal"/>
</xs:complexType>
Equivalente a (estrela | planeta | asteroide*)
24. argonavis.com.brargonavis.com.braa
bb
xxjj
24
Compilador de schemaCompilador de schema
●
Em JAXB, um esquema (DTD, XSD ou outro) está
associado a uma classe; documentos individuais
(instâncias XML) estão associados a objetos
● Para gerar uma classe (e código auxiliar) a partir
de um esquema, usa-se o compilador xjc
● Objetos criados a partir da classe gerada podem
ser persistidos em XML
Classe
Java
xjc
Esquema XML
(DTD, XSD, ...)
Java Binding
Schema opcional
Binding
XML
unmarshal()
marshal()
Objeto
Java
JAXB
Marshalling/Unmarshalling
25. argonavis.com.brargonavis.com.braa
bb
xxjj
25
Um exemplo: JAXB passo-a-passoUm exemplo: JAXB passo-a-passo
● 1. Escrever o XML Schema
● 2. Compilar o Schema e gerar classes
● 3. Usar as classes para criar objetos
● 4. Gravar objetos em XML
● 5. Ler objetos do XML
30. argonavis.com.brargonavis.com.braa
bb
xxjj
30
Passo 3: usar classes geradas...Passo 3: usar classes geradas...
● ... para construir um objeto Contato
ObjectFactory fabrica =
new ObjectFactory();
Contato contato =
fabrica.createContato();
contato.setNome("Nome");
TipoTelefone tel =
fabrica.createTipoTelefone();
contato.setTelefone(tel);
contato.getTelefone().setDdd(11);
contato.getTelefone().setNumero(1234567);
31. argonavis.com.brargonavis.com.braa
bb
xxjj
31
Passo 4: serializar para XMLPasso 4: serializar para XML
● Gravação no arquivo XML arquivo
JAXBContext ctx =
JAXBContext.newInstance("agenda");
Marshaller marsh = ctx.createMarshaller();
marsh.setProperty("jaxb.formatted.output",
new Boolean(true));
marsh.setProperty("jaxb.encoding",
"iso-8859-1");
File xmlf = new FileOutputStream(arquivo);
marsh.marshal(contato, xmlf);
32. argonavis.com.brargonavis.com.braa
bb
xxjj
32
Passo 5: ler do XMLPasso 5: ler do XML
● Arquivos XML estão em diretório xml.db (dir).
Código abaixo é para cada arquivo arqXML.
File arquivo = new File(dir, arqXML);
JAXBContext ctx =
JAXBContext.newInstance("agenda");
Unmarshaller unmarshaller =
ctx.createUnmarshaller();
Contato contato = (Contato)
unmarshaller.unmarshal(arquivo);
String nome = contato.getNome();
TipoTelefone tel = contato.getTelefone();
String telefone =
"("+tel.getDdd()+")"+tel.getNumero();
33. argonavis.com.brargonavis.com.braa
bb
xxjj
33
DemonstraçãoDemonstração
● Aplicação simples que utiliza o esquema mostrado
– Usa esquema (W3C XML Schema) para gerar classes
– Cria cinco objetos usando classes geradas
– Serializa os objetos em cinco documentos XML
– Lê e desserializa os documentos XML e obtém objetos
● Para executar, é preciso
– Ant (o script está em um build.xml)1.3 ou superior
– Java Web Services Development Pack 1.3 ou superior
– Definir variáveis de ambiente (build.properties)
●
Targets
– ant run.criar (cria objetos e grava XMLs em xml.db/)
– ant run.listar (lista dados obtidos dos arquivos XML)
34. argonavis.com.brargonavis.com.braa
bb
xxjj
34
ConclusõesConclusões
●
Esta palestra explorou os principais recursos do JAXB, que
são a capacidade de ler e gravar documentos XML de
forma transparente, através da geração automática de
código Java e documentos XML
● Vários aspectos importantes foram deixados de fora, como
– Validação na leitura e na gravação
– Manipulação de esquemas mais complexos (documentos
compostos, com namespaces, imports, atributos, tipos
estendidos, herança, etc.)
– Uso de configurações opcionais
– Aplicações em transformação XML e Web Services
●
Aprenda mais sobre JAXB nos links a seguir...
35. argonavis.com.brargonavis.com.braa
bb
xxjj
35
FontesFontes
● Página principal. java.sun.com/xml/jaxb/
● Java Web Services Tutorial.
java.sun.com/webservices/docs/1.4/tutorial/doc/JAXBWorks.html
● Fordin, Scott. Java Architecture for XML Binding
wwws.sun.com/software/xml/developers/jaxb/
● Shelby, J. Developing with JAXB and Ant
www.onjava.com/pub/a/onjava/2002/03/06/jaxant1.html
● Steinberg, D. et al. Tutorial: Data Binding with
JAXB. www-106.ibm.com/developerworks/edu/x-dw-xjaxb-i.html