ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
1v
b
b
a
a
x
x
j
j
a
ml
helder.da.rochahelder@argonavis.com.br argonavisargonavis.com.br.com.br
2004
inding
< >
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
2Explorar 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
Objetivos
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
3Mapeamento Java - XML
Mapeamento 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 EstiloXSLT Documento XML / HTML DOM SAX Texto DOM
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
4O 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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
5Transparência com XML binding
Transparê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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
6Solução para persistência de dados
Solução para persistência de dados
●
Usando serialização Java
●
Usando mapeamento Java-XML
Byte BLOB writeObject() readObject() marshal() unmarshal() <xml> <xml> <xml>
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
7JAXB
JAXB
●
J
ava
A
rchitecture for
X
ML
B
inding
– 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,
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
8Arquitetura
Arquitetura
Fonte: java.sun.com/jaxb/ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
9Típico processo JAXB
Tí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.
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
10Processo JAXB
Processo JAXB
Fonte: java.sun.com/jaxb/ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
11Principais classes e pacotes
Principais 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.
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
12O q
O q
ue é 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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
13DTD vs. XML Schema
DTD 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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
14 Atributos ElementosUm DTD
Um 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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
15Um XSD equivalente
Um 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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
16Fundamentos XML Schema: Tipos
Fundamentos 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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
17Tipos simples do XML Schema
Tipos 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 integer nonPositiveInteger nonNegativeInteger negativeInteger positiveInteger long int short byte unsignedLong unsignedInt unsignedShort unsignedByte boolean base64binary hexbinary
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
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>
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
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>
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
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"/>
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
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>
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
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>
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
23Mapeamento XML Java
Mapeamento XML Java
●Os tipos primitivos do
XML Schema são
mapeados a tipos
primitivos da linguagem
Java
●A tabela ao lado
relaciona os
mapeamentos
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
24Compilador de schema
Compilador 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/Unmarshallingar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
25Um exemplo: JAXB passo-a-passo
Um 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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
26Passo 1: escrever o schema
Passo 1: escrever o schema
<?xml version="1.0" encoding="iso-8859-1" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="contato" type="tipoContato" />
<xsd:complexType name="tipoContato"> <xsd:sequence>
<xsd:element name="nome" type="xsd:string"/>
<xsd:element name="telefone" type="tipoTelefone"/> </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="tipoTelefone"> <xsd:sequence>
<xsd:element name="ddd" type="xsd:int"/> <xsd:element name="numero" type="xsd:int"/> </xsd:sequence>
</xsd:complexType> </xsd:schema>
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
27Exemplos de XML compatíveis
Exemplos de XML compatíveis
<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?> <contato><nome>Bug Informática Ltda.</nome> <telefone> <ddd>19</ddd> <numero>77779191</numero> </telefone> </contato> <?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?> <contato>
<nome>Bug Informática Ltda.</nome> <telefone>
<ddd>19</ddd>
<numero>77779191</numero> </telefone>
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
28Passo 2: gerar as classes
Passo 2: gerar as classes
●
Configure as variáveis de ambiente e classpath
– JWSDP_HOME – JAXB_HOME=$JWSDP_HOME/jaxb ●
Execute a ferramenta xjc
● $JWSDP_HOME/jaxb/bin/xjc.sh -d gen.src -p agenda contato.xsd●
Nosso exemplo usa o Ant:
<target name="compile-jaxb" ...>
<java jar="${jaxb.home}/lib/jaxb-xjc.jar" fork="true"> <arg line="-d ${gen} -p ${pacote} ${etc}/contato.xsd"/> </java>
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
29Classes geradas
Classes geradas
Pacote agenda.impl.runtime ●ErrorHandlerAdaptor.java ●ValidationContext.java ●SAXUnmarshallerHandlerImpl.java ●AbstractUnmarshallingEventHandlerImpl.java ●ValidatableObject.java ●NamespaceContextImpl.java ●UnmarshallableObject.java ●ContentHandlerAdaptor.java ●Discarder.java ●ValidatorImpl.java ●Util.java ●SAXUnmarshallerHandler.java ●DefaultJAXBContextImpl.java ●InterningUnmarshallerHandler.java ●SAXMarshaller.java ●GrammarInfo.java ●UnmarshallingContext.java ●GrammarInfoImpl.java ●GrammarInfoFacade.java ●ValidatingUnmarshaller.java ●Pacote agenda.impl ●ContatoImpl.java ●JAXBVersion.java ●TipoContatoImpl.java ●TipoTelefoneImpl.java Pacote agenda. ●Contato.java ●ObjectFactory.java ●TipoContato.java ●TipoTelefone.java ●bgm.ser ●jaxb.properties Pacote agenda.impl.runtime ●NamespaceContext2.java ●UnmarshallingEventHandler.java ●UnmarshallingEventHandlerAdaptor.java ●PrefixCallback.java ●MSVValidator.java ●UnmarshallerImpl.java ●MarshallerImpl.java ●XMLSerializable.java ●XMLSerializer.java 39 arquivos!ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
30Passo 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);
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
31Passo 4: serializar para XML
Passo 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);
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
32Passo 5: ler do XML
Passo 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 =
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
33Demonstração
Demonstraçã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)
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
34Conclusões
Conclusõ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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
35Fontes
Fontes
●
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
ar gonav is.c om .b r ar gonav is.c om .b r
a
a
b
b
j
j
x
x
36 Esta palestra ecódigo-fonte usado nos exemplos demonstrados estão disponíveis em