Edifício de código personalizado com Java API para XML Binding (JAXB)

Você pode construir o código personalizado com JAXB

- a Java API para XML Binding. Com JAXB, você toma um documento XML e você faz um arquivo de classe Java que é perfeito para o processamento do documento. Quando suas necessidades mudam ea classe não faz o que você quer fazer, você só gerar uma nova subclasse.

Quando você escreve SAX ou código DOM, você cria um programa de processamento de XML. Seu programa lê um documento, e usa o documento para fazer trabalho útil - começando com algo inofensivo como startElement public void ou node.getNodeName (). De qualquer maneira, seu programa não faz suposições sobre o que está dentro do documento. O documento tem um raiz elemento, alguns elementos filho, e isso é tudo. Quaisquer hipóteses especiais que você faz sobre este documento, na verdade, reduzir a utilidade do código.

Código versátil contra o código personalizado

Considere o código nas Listagens 1 e 2. Listagem 1, verifica cinco nós de uma árvore de documentos. Esses cinco nós temos que ser organizados de uma determinada maneira, ou então as falhas do programa. (A listagem quer um comentário e um nó raiz, com pelo menos dois filhos diretamente sob o nó raiz.)

Listagem 1: Exibindo alguns nós

importação org.w3c.dom.Node-
importação org.w3c.dom.NamedNodeMap-
classe MyTreeTraverser
{
MyTreeTraverser (nó Node)
{
System.out.println (node.getNodeName ()) -
nó = node.getFirstChild () -
System.out.println (node.getNodeName ()) -
nó = node.getNextSibling () -
System.out.println (node.getNodeName ()) -
nó = node.getFirstChild () -
System.out.println (node.getNodeName ()) -
nó = node.getNextSibling () -
System.out.println (node.getNodeName ()) -
}
}

Listagem 2: percorrer a árvore DOM

importação org.w3c.dom.Node-
importação org.w3c.dom.NamedNodeMap-
classe MyTreeTraverser
{
Nó- nó
MyTreeTraverser (nó Node)
{
this.node = Nó-
Mostrar nome()-
displayValue () -
Se (node.getNodeType () == Node.ELEMENT_NODE)
displayAttributes () -
System.out.println () -
displayChildren () -
}
anular displayName ()
{
System.out.print ( "Name:") -
System.out.println (node.getNodeName ()) -
}
anular displayValue ()
{
Cordas nodeValue = node.getNodeValue () -
if (nodeValue! = null)
nodeValue = nodeValue.trim () -
System.out.print ( "Value:") -
System.out.println (nodeValue) -
}
displayAttributes void ()
{
NamedNodeMap attribs = node.getAttributes () -
for (int i = 0- i lt; attribs.getLength () - i ++)
{
System.out.println () -
System.out.print ( "Atributo:") -
System.out.print (attribs.item (i) .getNodeName ()) -
System.out.print ( "=") -
System.out.printlnl (attribs.item (i) .getNodeValue ()) -
}
}
displayChildren void ()
{
criança nó = node.getFirstChild () -
while (criança! = null)
{
nova MyTreeTraverser (criança) -
child = child.getNextSibling () -
}
}
}

O código na Listagem 2 é muito mais geral. Este código verifica a estrutura do documento como ele é executado. Quando o código encontra um nó filho, ele verifica a criança e olha para os netos. Se não houver netos, o código procura por irmãos e irmãs. O código pode lidar com qualquer árvore de documentos - se é de um nó ou um milhar de nós.

Assim, Listagem 2 é mais versátil do que Listagem 1. No entanto, essa versatilidade vem com desvantagens - incluindo a possibilidade de muito alta em cima. O código na Listagem 2 tem para analisar todo o documento XML - e depois colocar uma representação da árvore do documento na memória do computador. Se o documento for muito grande, então a representação é grande: Memória fica inchado com todos que os dados temporários, eo código na Listagem 2 retarda a um rastejamento.

Os benefícios de personalização

Imagine que você está tentando conduzir a Faneuil Hall, em Boston, Massachusetts. Não importa onde você começa de- a viagem será sempre confuso e difícil. De qualquer forma, você tem que planejar sua rota. Você pode se perder nas proximidades de Revere, Cambridge ou no centro de Boston. Dependendo de seus recursos, você tem duas opções:

  • Você pode parar em um posto de gasolina e comprar um mapa. Se fizer isso, então você pode nunca chegar a Faneuil Hall. Afinal, você tem que encontrar onde você está no mapa, procurar rotas alternativas, escolher uma rota e, em seguida (céu ajudá-lo) tentar seguir o caminho sem se perder novamente.
  • Você pode dizer ao seu sistema de GPS caro, falando que você quer chegar ao Faneuil Hall. O sistema irá traçar uma rota personalizada e guiá-lo, volta a volta, a partir de qualquer lugar miserável você está em para a melhor rota que leva de lá para Faneuil Hall. A rota é tão personalizada que a voz GPS diz (por exemplo), "Não há nenhum sinal neste cruzamento, mas vire à esquerda de qualquer maneira." Mais tarde, a voz diz: "Há dois sinais neste cruzamento, e os sinais contraditórios entre si. Mas vire à direita de qualquer maneira."

Usando o mapa de papel dá mais trabalho (mais tempo, esforço, destreza e paciência) de usar o GPS falar. Por quê? Porque o mapa de papel não é personalizado para o seu necessidades- específica em vigor, que diz: "Aqui está toda a área metropolitana de Boston. Faneuil Hall está em algum lugar. Você descobrir o que fazer a seguir. "

Um sistema personalizado é (como você pode esperar) mais fácil de usar do que um que não é adaptado à sua situação imediata. Assim, o código de processamento de XML da Listagem 2 faz uma enorme árvore DOM,-engolindo recurso no espaço de memória do seu computador ( "Aqui está a árvore - você descobrir o que fazer a seguir. . .. ") Porque o código não é personalizado O código funciona para qualquer documento antigo - e não apenas o que você tem na mão - e sempre engole recursos para fazê-lo.

A essência do JAXB

A idéia por trás JAXB é criar classe sob medida para atender às suas necessidades atuais. Você toma a descrição de um documento XML, executá-lo através de um programa especial chamado compilador de esquema, e obter uma marca nova classe chamada classe gerada. Esta classe gerada é simplificado para trabalhar com determinados documentos XML.

Por exemplo, se seus documentos XML tem elementos nomeados total, então a classe gerada pode ter métodos setTotal e getTotal. Se o elemento de um documento tem um atributo fullName, em seguida, a classe gerada pode ter métodos setFullName e getFullName. (Veja Figura 1.)

A ligação entre uma parte de um documento XML e uma parte de uma classe de Java é chamado um obrigatório. Com todas essas ligações, uma instância da classe representa um único documento XML.


Figura 1: Um objecto representa um documento.

Assim como você conectar um objeto com um documento XML? Bem, a classe gerada tem métodos chamados unmarshal e marechal. (Ver Figura 2)

  • O método unmarshal lê um arquivo XML. O método obtém valores a partir do documento XML, e atribui estes valores para as variáveis ​​do objeto Java.
  • O método marechal grava um arquivo XML. O método obtém os valores do objeto Java, e usa esses valores para criar o documento XML.

Com métodos como estes, você pode recuperar e modificar os dados em um documento XML.


Figura 2: Leitura e escrita valores.

menu