Trabalhando com Documentos XML
Nesta seção, você aprenderá sobre como executar o compilador de ligação JiBX e como usar JiBX no tempo de execução para trabalhar com documentos XML.
Executando o Compilador de Ligação JiBX
Para usar a definição de ligação gerada no trabalho com documentos XML, primeiro, você precisa executar o compilador de ligação JiBX. O compilador de ligação inclui bytecode em seus arquivos de classe compilados que realmente implementa as conversões para e a partir de XML, conforme especificado pela definição de ligação. Você deve executar o compilador de ligação toda vez que recompilar suas classes Java ou modificar a definição de ligação, portanto, geralmente é melhor incluir a etapa do compilador de ligação como parte do processo de construção padrão de seu projeto.
O compilador de ligação está incluído na distribuição JiBX como parte do jibx-bind.jar. A documentação de JiBX fornece detalhes integrais sobre as diferentes maneiras de executar o compilador de ligação, inclusive como você pode chamá-lo ao executar ser aplicativo em vez de como parte da construção. JiBX também fornece plug-ins para o Eclipse e o IntelliJ IDEA que executam o compilador de ligação automaticamente quando você está trabalhando nesses IDEs.
Para os propósitos deste tutorial, vamos manter as coisas simples e simplesmente executar o compilador de ligação através de Ant. O destino compile debuild.xml prepara para a ligação compilando o código gerado e um programa de teste fornecido, enquanto o destino bind realmente executa o compilador de ligação. A Figura 2 mostra a saída que você deve ver ao executar esses destinos, supondo que você já tenha executado os destinos codegen . (Você também pode executar todos os três destinos em seqüência, listando-os em ordem na linha de comando: ant codegen compile bind.)
Figura 2. Tarefas de Construção Ant compile e bind
Usando JiBX no Tempo de Execução
A Listagem 3 mostra um documento de teste simples que corresponde ao esquema, incluído no download do código do tutorial como starter.xml:
Listagem 3. Documento de Teste para Esquema de Pedido
<order orderDate="2008-10-18" shipDate="2008-10-22" xmlns="http://jibx.org/starter">
<orderNumber>12345678</orderNumber>
<customer>
<customerNumber>5678</customerNumber>
<firstName>John</firstName>
<lastName>Smith</lastName>
</customer>
<billTo state="WA" postCode="98059">
<street1>12345 Happy Lane</street1>
<city>Plunk</city>
<country>USA</country>
</billTo>
<shipping>PRIORITY_MAIL</shipping>
<shipTo state="WA" postCode="98034">
<street1>333 River Avenue</street1>
<city>Kirkland</city>
</shipTo>
<item quantity="1" price="5.99" id="FA9498349851"/>
<item quantity="2" price="9.50" id="GC1234905049"/>
<item quantity="1" price="8.95" id="AX9300048820"/>
</order> |
O pacote de download também inclui um programa de teste simples, mostrado aqui como a Listage, 4, que demonstra o uso de JiBX para desserializar e serializar documentos. Serializar é o processo de gerar uma representação XML para um objeto em memória, potencialmente incluindo objetos vinculados a partir do objeto original. Desserializar é o processo inverso de serializar, construir um objeto (e potencialmente um gráfico de objetos vinculados) em memória de uma representação XML. O destino Ant run executa esse programa de teste, usando o documento Listagem 3 como entrada e gravando a cópia serializada do documento em um arquivo denominado out.xml.
Listagem 4. Programa de Teste
public class Test
{
/**
* Desserializar o documento de amostra de um arquivo, computar e configurar total do pedido, em seguida,
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- Erro XML: A linha anterior não é maior do que o máximo de 90 caracteres ---------|
* serializá-lo novamente em outro arquivo.
*
* @param args
*/
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage: java -cp ... " +
"org.jibx.starter.Test in-file out-file");
System.exit(0);
}
try {
// desserializar as informações do cliente do arquivo
IBindingFactory bfact = BindingDirectory.getFactory(Order.class);
IUnmarshallingContext uctx = bfact.createUnmarshallingContext();
FileInputStream in = new FileInputStream(args[0]);
Order order = (Order)uctx.unmarshalDocument(in, null);
// compute o valor total do pedido
float total = 0.0f;
for (Iterator<Item> iter = order.getItems().iterator(); iter.hasNext();) {
Item item = iter.next();
total += item.getPrice() * item.getQuantity();
}
order.setTotal(new Float(total));
// desserializar objeto de volta para o arquivo (com bom deslocamento, como UTF-8)
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- Erro XML: A linha anterior não é maior do que o máximo de 90 caracteres ---------|
IMarshallingContext mctx = bfact.createMarshallingContext();
mctx.setIndent(2);
FileOutputStream out = new FileOutputStream(args[1]);
mctx.setOutput(out, null);
mctx.marshalDocument(order);
System.out.println("Processed order with " + order.getItems().size() +
" items and total value " + total);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.exit(1);
} catch (JiBXException e) {
e.printStackTrace();
System.exit(1);
}
}
} |
A Figura 3 mostra a saída que você deve ver ao executar o destino run :
Figura 3. Tarefa de Construção Ant run
Esse é o mesmo programa de teste que o usado na Parte 1 e está sujeito às mesmas limitações discutidas nesse tutorial. Exatamente como na Parte 1, o arquivo out.xml possui a saída gerada serializando de volta os dados do pedido obtidos desserializando o documento original.
|