Este tutorial ensina como criar documentos XML a partir do zero através da interface Writer do Xisemele.
Para escrever um documento XML do zero você precisa obter uma instância de Writer da seguinte forma:
import net.sf.xisemele.api.Writer; import net.sf.xisemele.impl.XisemeleFactory;
Writer writer = XisemeleFactory.newXisemele().createWriter( nomeElementoRaiz );
Neste caso nomeElementoRaiz deve ser uma String contendo o nome que será aplicado ao elemento raiz do documento XML criado.
Por exemplo, o código:
import net.sf.xisemele.api.Writer; import net.sf.xisemele.impl.XisemeleFactory;
Writer writer = XisemeleFactory.newXisemele().createWriter("raiz"); String xml = writer.result().ident(true).toXML(); System.out.println( xml );
Imprime no console o seguinte XML:
<?xml version="1.0" encoding="UTF-8"?> <raiz/>
O método Writer.result() retorna uma instância da interface Result. Essa interface abstrai a transformação do documento XML para outro formato como String, arquivo, etc. Veja mais detalhes sobre como usar esse recurso na seção Result.
A interface Writer fornece os métodos Writer.attribute(String, Object) (nome, valor) e Writer.attribute(String, java.util.Date, String) (nome, data, formato) para a adição de atributos ao elemento corrente da escrita de XML.
Por exemplo, o código:
import java.util.Date; import net.sf.xisemele.api.Writer; import net.sf.xisemele.impl.XisemeleFactory;
Writer writer = XisemeleFactory.newXisemele().createWriter("raiz") .attribute("Id", 123) .attribute("ultima-modificacao", new Date(), "dd/MM/yyyy"); String xml = writer.result().ident(true).toXML(); System.out.println( xml );
Imprime no console o seguinte XML:
<?xml version="1.0" encoding="UTF-8"?> <raiz Id="123" ultima-modificacao="29/07/2009"/>
A chamada ao método Writer.attribute() adiciona um atributo somente ao último elemento criado.
Por exemplo, no código:
import net.sf.xisemele.api.Writer; import net.sf.xisemele.impl.XisemeleFactory;
Writer writer = XisemeleFactory.newXisemele().createWriter("raiz") .within() .element("elementoA").attribute("atr", "valor de atr") .endWithin(); String xml = writer.result().ident(true).toXML(); System.out.println( xml );
A chamada ao método Writer.attribute() está adicionando um atributo com nome atr ao elemento elementoA, como pode ser observado no XML resultante impresso no console:
<?xml version="1.0" encoding="UTF-8"?> <raiz> <elementoA atr="valor de atr"/> </raiz>
Os métodos Writer.within(), Writer.element() e Writer.endWithin() serão apresentados mais adiante nesse tutorial.
A API do Xisemele define um conceito chamado de contexto within que indica o nível, na hierarquia do documento XML, em que os elementos poderão ser adicionados. Esse contexto pode ser iniciado ou finalizado invocando-se os métodos Writer.within() e Writer.endWithin(), respectivamente. A chamada ao método Writer.within() faz com que os próximos elementos sejam adicionados como filhos do elemento criado antes da inicialização do contexto within.
Observe o exemplo:
import net.sf.xisemele.api.Writer; import net.sf.xisemele.impl.XisemeleFactory;
Writer writer = XisemeleFactory.newXisemele().createWriter("raiz") .within() // (1) .element("elementoA") .element("elementoB") .within() // (2) .element("elementoC") .element("elementoD") .endWithin() // (3) .element("elementoE") .endWithin(); // (4) String xml = writer.result().ident(true).toXML(); System.out.println( xml );
A chamada (1) inicia um contexto within para o elemento raiz do documento XML. A partir daí todos os elementos adicionados serão filhos da raiz até que um novo contexto within seja iniciado, como é o caso da chamada (2). É iniciado um contexto within para o elementoB e na sequência são adicionados os elementos filhos elementoC e elementoD. A chamada (3) finaliza o último contexto within inicializado. A partir desse ponto o contexto within corrente passa a ser o da raiz do documento XML. Por último, a chamada (4) finaliza o contexto within do elemento raiz.
A execução do código acima imprime no console o seguine XML:
<?xml version="1.0" encoding="UTF-8"?> <raiz> <elementoA/> <elementoB> <elementoC/> <elementoD/> </elementoB> <elementoE/> </raiz>
A API de escrita do Xisemele fornece quatro métodos para adicição de elementos XML: Writer.element(String) (nome), Writer.element(String, Object) (nome, valor), Writer.element(String, java.util.Date, String) (nome, data, formato) e Writer.element(Element).
O Xisemele implementa um conceito de que elementos podem ter valor. Veja mais detalhes sobre isso na seção Valores.
Elementos sem valor podem ser adicionados a um documento XML da seguinte forma:
import net.sf.xisemele.api.Writer; import net.sf.xisemele.impl.XisemeleFactory;
Writer writer = XisemeleFactory.newXisemele().createWriter("raiz") .within() .element("elementoA") .element("elementoB") .endWithin(); String xml = writer.result().ident(true).toXML(); System.out.println( xml );
O método Writer.element(String) adiciona um elemento com o nome especificado por parâmetro no contexto within corrente.
O trecho de código acima imprime no console o seguinte XML:
<?xml version="1.0" encoding="UTF-8"?> <raiz> <elementoA/> <elementoB/> </raiz>
Elementos com valor podem ser adicionados a um documento XML da seguinte forma:
import java.util.Date; import net.sf.xisemele.api.Writer; import net.sf.xisemele.impl.XisemeleFactory;
Writer writer = XisemeleFactory.newXisemele().createWriter("raiz") .within() .element("elementoA", 12) .element("elementoB", new Date(), "dd/MM/yyyy") .endWithin(); String xml = writer.result().ident(true).toXML(); System.out.println( xml );
O método Writer.element(String, Object) adiciona um elemento como o nome e valor especificados por parâmetro no contexto within corrente. A forma como o valor especificado é convertido para String depende de como os Formatadores foram configurados para o tipo correspondente.
O método Writer.element(String, java.util.Date, String) adiciona um elemento com o nome e valor no contexto within corrente de tal forma que o valor é a data formatada de acordo como o padrão especificado.
O trecho de código acima imprime no console o seguinte XML:
<?xml version="1.0" encoding="UTF-8"?> <raiz> <elementoA>12</elementoA> <elementoB>31/07/2009</elementoB> </raiz>
A API de escrita do Xisemele fornece o método Writer.element(Element) que permite a adição de uma instância de Element, correspondente ao elemento de um outro documento XML, no contexto within corrente do documento XML que está sendo escrito do zero. A adição de uma instância de Element resultará na adição de todos os atributos e elementos filhos pertencentes ao elemento.
Por exemplo, o seguinte trecho de código:
import net.sf.xisemele.api.Element; import net.sf.xisemele.api.Writer; import net.sf.xisemele.api.Xisemele; import net.sf.xisemele.impl.XisemeleFactory;
Xisemele xisemele = XisemeleFactory.newXisemele(); String outroXML = "<outro>" + "<novoElemento atr=\"valor atr\">" + "<filho1>valor 1</filho1>" + "<filho2>valor 2</filho2>" + "</novoElemento>" + "</outro>"; Element novoElemento = xisemele.createReader( outroXML ).find("outro/novoElemento"); Writer writer = xisemele.createWriter("raiz") .within() .element("elemento", Boolean.TRUE) .element(novoElemento) .endWithin(); String xml = writer.result().ident(true).toXML(); System.out.println( xml );
Imprime no console o seguinte XML:
<?xml version="1.0" encoding="UTF-8"?> <raiz> <elemento>true</elemento> <novoElemento atr="valor atr"> <filho1>valor 1</filho1> <filho2>valor 2</filho2> </novoElemento> </raiz>
Neste último exemplo uma instância de Element foi recuperada através de uma instância de Reader. Veja como ler documentos XML na seção Leitura de documentos XML.