Índice:
Vídeo: AWS re:Invent 2015 | (DEV204) Building High-Performance Native Cloud Apps In C++ 2024
Você pode criar um código personalizado com JAXB - o Java API for XML Binding . Com o JAXB, você tira um documento XML e faz um arquivo de classe Java perfeito para processar o documento. Quando suas necessidades mudam e a classe já não faz o que você quer que faça, você acabou de criar uma nova subclasse.
Quando você escreve o código SAX ou DOM, você cria um programa de processamento XML. Seu programa lê um documento e usa o documento para fazer um trabalho útil - começando com algo inofensivo como public void startElement ou nó. getNodeName (). De qualquer forma, seu programa não faz suposições sobre o que está dentro do documento. O documento tem um elemento raiz, alguns elementos filho, e isso é tudo. Quaisquer hipóteses especiais que você faz sobre esse documento realmente restringem a utilidade do código.
Código versátil versus código personalizado
Considere o código nas Listagens 1 e 2. A Listagem 1, verifica cinco nós em uma árvore de documentos. Esses cinco nós precisam ser organizados de uma certa maneira, ou então o programa falha. (A lista quer um comentário e um nó raiz, com pelo menos dois filhos diretamente sob o nó raiz.)
Listagem 1: Exibindo alguns nós
importar org. w3c. dom. Nó;
import org. w3c. dom. NamedNodeMap;
classe MyTreeTraverser
{
MyTreeTraverser (nó do nó)
{
Sistema. Fora. println (node. getNodeName ());
node = node. getFirstChild ();
Sistema. Fora. println (node. getNodeName ());
node = node. getNextSibling ();
Sistema. Fora. println (node. getNodeName ());
node = node. getFirstChild ();
Sistema. Fora. println (node. getNodeName ());
node = node. getNextSibling ();
Sistema. Fora. println (node. getNodeName ());
}
}
Listagem 2: Percorrendo a árvore DOM
import org. w3c. dom. Nó;
import org. w3c. dom. NamedNodeMap;
classe MyTreeTraverser
{
Nó do nó;
MyTreeTraverser (nó do nó)
{
isto. node = node;
displayName ();
displayValue ();
se (nó. GetNodeType () == Nó. ELEMENT_NODE)
displayAttributes ();
Sistema. Fora. println ();
displayChildren ();
}
void displayName ()
{
Sistema. Fora. imprimir ("Nome:");
Sistema. Fora. println (node. getNodeName ());
}
void displayValue ()
{
String nodeValue = node. getNodeValue ();
if (nodeValue! = Null)
nodeValue = nodeValue. aparar();
Sistema. Fora. imprimir ("Valor:");
Sistema. Fora. println (nodeValue);
}
void displayAttributes ()
{
NamedNodeMap attribs = nó. getAttributes ();
para (int i = 0; i { Sistema. Fora. println (); Sistema. Fora. imprimir ("Atributo:"); Sistema. Fora. print (attribs. item (i). getNodeName ()); Sistema. Fora. imprimir ("="); Sistema. Fora. println (attribs. item (i). getNodeValue ()); } } void displayChildren () { Nó child = node. getFirstChild (); while (child! = Null) { novo MyTreeTraverser (filho); criança = criança. getNextSibling (); } } } O código na Listagem 2 é muito mais geral. Esse código verifica a estrutura do documento conforme ele é executado. Quando o código encontra um nó filho, ele varre a criança e procura por netos. Se não houver netos, o código procura irmãos e irmãs. O código pode lidar com qualquer árvore de documentos - se possui um nó ou mil nós. Assim, o Listado 2 é mais versátil do que o Listado 1. No entanto, essa versatilidade vem com inconvenientes - incluindo a possibilidade de despesas gerais muito altas. O código na Listagem 2 tem que 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, a representação é grande: a memória fica inchada com todos os dados temporários e o código da Listagem 2 diminui para um rastreamento. Imagine que você está tentando dirigir para Faneuil Hall em Boston, Massachusetts. Não importa de onde você começar; a viagem sempre será confusa e difícil. De qualquer forma, você precisa planejar sua rota. Você pode se perder nas proximidades de Revere ou Cambridge ou no centro de Boston. Dependendo dos seus recursos, você tem duas opções: Usar o mapa de papel leva mais trabalho (mais tempo, esforço, destreza e paciência) do que usar o GPS falante. Por quê? Como o mapa em papel não é personalizado para suas necessidades específicas; na verdade, diz: "Aqui está toda a área metropolitana de Boston. Faneuil Hall está lá em algum lugar. Você descobrir o que fazer a seguir. " Um sistema personalizado é (como você pode esperar) mais fácil de usar do que aquele que não está adaptado à sua situação imediata. Assim, o código de processamento XML do Listado 2 faz uma enorme árvore de DOM que engasga recursos no espaço de memória do seu computador ("Aqui está a árvore - você descobrir o que fazer em seguida …") porque o código não é ' T personalizado.O código funciona para qualquer documento antigo - não apenas o que você tem em mãos - e sempre engolir recursos para fazê-lo. A idéia por trás do JAXB é criar uma classe customizada para atender às suas necessidades atuais. Você tira a descrição de um documento XML, execute-o através de um programa especial chamado compilador de esquema e obtenha uma nova classe chamada classe gerada . Essa classe gerada é simplificada para trabalhar com documentos XML específicos. Por exemplo, se seus documentos XML possuem elementos denominados Total, a classe gerada pode ter métodos setTotal e getTotal. Se o elemento de um documento tiver um atributo fullName, a classe gerada pode ter os métodos setFullName e getFullName. (Veja a Figura 1.) A conexão entre uma parte de um documento XML e uma parte de uma classe Java é chamada de vinculativo . Com todas essas ligações, uma instância da classe representa um único documento XML. Então, como você conecta um objeto com um documento XML? Bem, a classe gerada possui métodos chamados unmarshal e marshal. (Veja a Figura 2.) Com métodos como esses, você pode recuperar e modificar os dados em um documento XML.Os benefícios da personalização
A essência do JAXB