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.