Download - Fórum

Guia do Usuário Conteúdo

  1. Conhecimento Prévio Necessário
  2. Clássico "Hello World" com SAX
  3. Clássico "Hello World" com JColtrane
  4. Anotações Básicas de Condição
  5. Opcões de Filtragem de Elementos
  6. Outras Formas de Filtragem
  7. Construindo Suas Próprias Condições de Filtragem
  8. Como Receber Parâmetros do JColtrane
  9. Extendendo o Processamento XML.

Ajude a manter o projeto

Outras Formas de Filtragem

Na seção anterior vimos algumas formas de filtrar os elementos que queríamos. Além dessas opções, JCotrane possui outras: BeforeElement e InsideElement. Veremos ambas em detalhes, baseados no código XML que se segue:

<?xml version="1.0" encoding="UTF-8"?>

<beanDescriptor>

      <line>

            <property  mandatory="true" page="4" language="pt" />

            <paragraphy>

                  <phrase />

            </paragraphy>               

            <property2  mandatory="false"  nacionality="pt" />

      </line>

</beanDescriptor>

BeforeElement

Algumas vezes, para executar alguma tarefa de processamento, você quer que algum elemento anterior ao atual já tenha iniciado e não tenha terminado ainda. Então vamos supor que você queira executar alguma tarefa quando um elemento estiver iniciando e o elemento anterior seja paragraphy. Para realizar essa tarefa, escrevos a seguinte classe:

public class BeforeElementClass { 

      @BeforeElement(elementDeep=1,tag="paragraphy")

      @StartElement

      public void executeInStartElement(@CurrentBranch String currentBranch){

            System.out.println(currentBranch);

            System.out.println("Executing something in start element\n");

      }    

}

Como você pode notar, usamos a anotação BeforeElement para informar ao JColtrane o que queríamos. Quando o JColtrane está processando algum documento, ele empilha o elemento em uma pilha quando o mesmo inicia e desempilha quando o mesmo termina. Dessa forma, elementDeep com valor 1 indica o primeiro elemento antes do elemento corrente, com valor 2, indica o segundo elemento antes do elemento corrente e assim sucessivamente.

Além da propriedade elementDeep, BeforeElement aceita as opções tag, uri, localName e ContainAttribute. Todas essas opções funcionam de forma análoga à que vimos nas anotações EndElement e StartElement.

Rodando o código, o sistema imprime:

/beanDescriptor/line/paragraphy/phrase/
Executing something in start element

NOTA: você deve usar BeforeElement em adição, com uma das anotações Element ou StartElement para indicar quando o método deve executar. Se você usar somente BeforeElement, o sistema não invocará o método anotado.

InsideElement

Vamos dizer que você queira executar algo toda vez que algum elemento inciou antes do corrente, em qualquer profundidade. Para fazer isso, Você pode usar a anotação InsideElement. Por exemplo, digamos que você queira executar alguma ação quando estiver iniciando qualquer elemento que esteja dentro do elemento com tag "line". Assim, você escreve a classe abaixo:

public class InsideElementClass {

      @InsideElement(tag="line")

      @StartElement

      public void executeInStartElement(@CurrentBranch String currentBranch){

            System.out.println(currentBranch);

            System.out.println("Executing something in start element\n");

      }

}

Além da opção tag, InsideElement aceita uri, localName e ContainAttribute. Todas opções funcionam de forma análoga à vista em EndElement eStartElement.

Rodando o código, o sistema imprime:

/beanDescriptor/line/
Executing something in start element

/beanDescriptor/line/property/
Executing something in start element

/beanDescriptor/line/paragraphy/
Executing something in start element

/beanDescriptor/line/paragraphy/phrase/
Executing something in start element

/beanDescriptor/line/property2/
Executing something in start element

NOTA: Assim como BeforeElement, você deve usar InsideElement em adição a EndElement ou StartElement para indicar quando o método deve ser executado. Caso contrário, se você usar apenas InsideElement, o sistema não invocará o método anotado.

Agora que você viu como InsideElement e BeforeElement funcionam, vejamos como você pode construir suas próprias anotações com suas próprias condições em Construindo Suas Próprias Condições de Filtragem.