Geração de XML simples com DOM

3 respostas
T

Bom dia Pessoal, me foi passado um exercio, onde, por meio da API DOM, deveria gerar um XML e ler os valores do mesmo, pois bem, o XML, é o seguinte

<root>
	
	<colaborador id="1">
		<nome>Atanael</nome>
		<idade>20</idade>
	</colaborador>
		
	<colaborador id="2">
		<nome>Josemar</nome>
		<idade>21</idade>
	</colaborador>
	
</root>

Então , comecei minhas pesquisar e montei o codigo para cria-lo:

public class Teste {

	/**
	 * @param args
	 * @throws ParserConfigurationException 
	 */
	public static void main(String[] args) throws ParserConfigurationException {
		
	try {
		
		Coloborador um = new Coloborador();
		um.setId(1);
		um.setIdade(20);
		um.setNome("Atanael");
		
		Coloborador dois = new Coloborador();
		dois.setId(2);
		dois.setIdade(21);
		dois.setNome("Josemar");
		
		ArrayList<Coloborador> coloboradors = new ArrayList<Coloborador>();
		coloboradors.add(um); 
		coloboradors.add(dois);
		
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		Document doc = db.newDocument();
		Element elemRoot = doc.createElement("root");
		doc.appendChild(elemRoot);
		
		for (Coloborador c : coloboradors){
			
			Element em = doc.createElement ("colaborador");
			em.setAttribute("id",String.valueOf(c.getId()));
			elemRoot.appendChild(em);
		        Element emN = doc.createElement("nome");
			emN.appendChild(doc.createTextNode ( c.getNome() ));
			Element emI = doc.createElement("idade");
			emI.appendChild(doc.createTextNode (String.valueOf(c.getIdade())));
			em.appendChild(emN);
			em.appendChild(emI);
					
		}
			
		TransformerFactory transformerFactory = TransformerFactory.newInstance () ;
		Transformer transformer = transformerFactory.newTransformer () ;
		DOMSource source = new DOMSource ( doc ) ;
		StreamResult result = new StreamResult (new File ("C:\\wamp\\www\\XML\\src\\xmlcomdom.xml")) ;
		transformer.transform ( source, result ) ;
		
		
		
				   
	}
	
	 catch (TransformerException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	catch (ParserConfigurationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}	
		

	}

}

Dai, ele até gera, so que ele gera dessa forma :

<?xml version="1.0" encoding="UTF-8" standalone="no"?><root><colaborador id="1"><nome>Atanael</nome><idade>20</idade></colaborador><colaborador id="2"><nome>Josemar</nome><idade>21</idade></colaborador></root>

sem identação, sem quebra de linha, sem nada, em uma unica linha continua…

alguém sabe se tem algum metodo que faz essa “formatação”? Ou é gerado assim mesmo e não adianta?

Obrigado!

3 Respostas

Aleksandro

Bom dia,

Entre no site da loiane , que existe alguns artigos e exemplos dado por ela , explicando o conceito sobre DOM, boa sorte …

http://www.loiane.com

romarcio

Mesmo abrindo em um browser (firefox, IE, …) ele abre assim sem formatação?

T

romarcio, aah, verdade, nao tinha testado lá, la abre belezura! Só pelo proprio eclipse que ele abre zuadinho

Bom , nesse site que Aleksandro indicou, li isto:

Bem, já vimos como remover, modificar e adicionar elementos ao XML. Agora falta apenas gravar o arquivo modificado em algum lugar!
Se desejar, pode criar uma classe para montar o XML na mão, ou seja, montar as tags, identação, etc. Mas tem que tomar muito cuidado quando for fazer isso, pois pode acabar modificando a estrutura na serialização (sem querer), e o XML pode ficar inválido.

Uma maneira que muitos desenvolvedores utilizam é criar uma transformação identidade, ou seja, é uma transformação XSL sem folha de estilo.
Você cria uma origem (documento DOM) e um destino (arquivo XML), e aplica a transformação sem folha de estilo.

Então pelo jeito eh isso mesmo, se eu quiser bontinho, redondo, so criando uma classe pra fazer isso…

Obrigado galera!

EDIT:

Achei esses dois metodos:

transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, “yes”);
transformer.setOutputProperty(OutputKeys.INDENT, “yes”);

Para ser usado no transformador “TransformerFactory transformerFactory = TransformerFactory.newInstance () ;
Transformer transformer = transformerFactory.newTransformer () ;”

O primeiro faz com que aquela primeira linha com as caracteristicas do xml nao seja gerada, e a segunda, aplica um estilosinho, nada sofisticado, apenas quebra as linhas, sem identação, mas ja melhora o visual.

Criado 13 de janeiro de 2012
Ultima resposta 13 de jan. de 2012
Respostas 3
Participantes 3