Skip to content

Instantly share code, notes, and snippets.

@tuxcuiabano
Created September 29, 2018 21:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tuxcuiabano/d64f3069b74ead244c1dfd5891a3c8be to your computer and use it in GitHub Desktop.
Save tuxcuiabano/d64f3069b74ead244c1dfd5891a3c8be to your computer and use it in GitHub Desktop.
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package manipulaxml;
/**
*
* @author tuxcuiabano Retirado do Livro Texto "Tecnologia de Dados para
* Internet - MACIEL, C, 2018"
*/
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import com.sun.org.apache.xml.internal.serialize.*;
public class ManipulaXML {
// Função criada para localizar a posição do nó
// na lista de nós. Se não encontrá-lo, retorna -1.
public static int localizaPosicaoPorNome(String nome, NodeList lista) {
for (int i = 0; i < lista.getLength(); i++) {
String atual = lista.item(i).getNodeName();
if (atual == nome) {
return i;
}
}
return -1;
} //Fim da função localizaPosicaoPorNome
// Função criada para localizar a posição do nó alvo
// na lista de nós. Se não encontrá-lo, retorna -1.
public static int localizaPosicaoNo(Node alvo, NodeList lista) {
for (int i = 0; i < lista.getLength(); i++) {
Node atual = lista.item(i);
if (atual.isEqualNode(alvo)) {
return i;
}
}
return -1;
} // Fim da função localizaPosicaoNo
// Função criada para localizar a posição do primeiro nó do tipo
// encontrado na lista de nós. Se não encontrá-lo, retorna -1.
public static int localizaPosicaoPorTipo(short tipo, NodeList lista) {
for (int i = 0; i < lista.getLength(); i++) {
Node atual = lista.item(i);
if (atual.getNodeType() == tipo) {
return i;
}
}
return -1;
} // Fim da função localizaPosicaoPorTipo
public static void main(String[] args) {
if (args.length == 0) {
System.err.println("Informar o arquivo XML: /"
+ "java ManipulaXML <arquivo.xml>");
System.exit(1);
}
String arquivoXML = args[0];
DocumentBuilderFactory dbf
= DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
Document doc = null;
try {
db = dbf.newDocumentBuilder();
doc = db.parse(new File(arquivoXML));
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
// remoção do comentário antigo, que descrevia o documento
// XML anterior e, para manter legibilidade,
// remover a nova linha
Element raiz = doc.getDocumentElement();
NodeList lista = raiz.getChildNodes();
int posicao = localizaPosicaoPorTipo(Node.COMMENT_NODE, lista);
Node comentario = lista.item(posicao);
raiz.removeChild(comentario);
// como sabemos que antes de cada nó existe um nó texto
// para indentação ou nova linha,
// basta remover o nó anterior à posição
raiz.removeChild(lista.item(posicao - 1));
// alteração do elemento raiz nome para pessoas,
// conservando as informações de nome já existente
Node primeiro_registro = raiz.cloneNode(true);
raiz = doc.createElement("pessoas");
raiz.appendChild(primeiro_registro);
raiz.insertBefore(doc.createTextNode("\n"), primeiro_registro);
raiz.appendChild(doc.createTextNode("\n"));
doc.replaceChild(raiz, doc.getDocumentElement());
// inclusão de um comentário descritivo do documento XML,
// como primeiro filho do nó raiz
comentario = doc.createComment(" Registro de nomes de pessoas em XML. ");
raiz.insertBefore(comentario, raiz.getFirstChild());
raiz.insertBefore(doc.createTextNode("\n"), comentario);
// inclusão de um apelido (Tonico) ao nome já existente
// Para isso, precisamos localizar o nó apelido, filho do
// primeiro_registro, e então associá-lo a um novo nó texto
lista = primeiro_registro.getChildNodes();
posicao = localizaPosicaoPorNome("apelido", lista);
Node apelido = lista.item(posicao);
apelido.appendChild(doc.createTextNode("Tonico"));
// inclusão de um novo nome (Maria dos Santos) ao registro
// de nomes. Poderíamos criar um novo elemento nome e
// adicionar seus nós filhos com o formato do
// primeiro_registro. No entanto, já que temos as funções de
// localização e conhecemos a estrutura do documento XML,
// preferimos clonar o primeiro_registro e alterá-lo
Node segundo_registro = primeiro_registro.cloneNode(true);
lista = segundo_registro.getChildNodes();
// primeiro vamos alterar o primeiro nome da pessoa (Maria)
posicao = localizaPosicaoPorNome("primeiro", lista);
Node nome = lista.item(posicao);
nome.getFirstChild().setNodeValue("Maria");
// então alteramos o sobrenome e excluimos o apelido
posicao = localizaPosicaoPorNome("sobrenome", lista);
nome = lista.item(posicao);
nome.getFirstChild().setNodeValue("dos Santos");
posicao = localizaPosicaoPorNome("apelido", lista);
segundo_registro.removeChild(lista.item(posicao));
segundo_registro.removeChild(lista.item(posicao - 1));
// e agora, basta adicionar o segundo_registro à lista de
// nós filhos do elemento raiz assim como a nova linha
raiz.appendChild(segundo_registro);
raiz.appendChild(doc.createTextNode("\n"));
try {
OutputFormat formatter = new OutputFormat();
FileWriter out = new FileWriter("exemplo_ultimo.xml");
XMLSerializer serializer = new XMLSerializer(out, formatter);
formatter.setPreserveSpace(true);
serializer.serialize(doc);
} catch (Exception e) {
System.err.print("Problema na criação do arquivo XML.");
e.printStackTrace();
System.exit(1);
}
} // Fim da função main
} // Fim da classe XML_DOM_Manipula
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment