Created
September 29, 2018 21:08
-
-
Save tuxcuiabano/d64f3069b74ead244c1dfd5891a3c8be to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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