Inserir, editar, excluir e pesquisar em um xml

4 respostas
F

Pessoal, eu não estou conseguindo construir um metódo para excluir um nó do meu xml.

O Arquivo possui a seguinte estrutura:

santa maria rs ok 2008/01/29 8:56 ria OK 04/02/2008 11:28 pfb Danificada 04/02/2008 11:28

possuo a classe abaixo

import <a href="http://java.io">java.io</a>.<em>;

import java.util.</em>;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.OutputKeys;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerConfigurationException;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.TransformerFactoryConfigurationError;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Attr;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;
import java.util.Random;

import org.w3c.dom.DOMException;

/**

*
  • @author Fogliato
    */
    public class manipulaarquivo2 {

    /** Creates a new instance of manipulaarquivo2 */

    public String geraid() {
    
    StringBuffer sb = new StringBuffer();
    
    Random rand = new Random();
    
    for (int i = 0; i < 16; i++) {
    
    sb.append(Integer.toString(Math.abs(rand.nextInt()) % 16, 16));
    
    }
    
    return “”+sb.toString();
    
    }
    
    public void insere(String pedido, String localizacao, String status, String datahora){
    
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    
    DocumentBuilder docBuilder = null;
    
    Document doc = null;;
    
    try {  
        
          docBuilder = docFactory.newDocumentBuilder();  
          doc = docBuilder.parse("/home/arquivos/TFG/projeto/PDA/encomendas.xml");  
            
      }   
      catch (ParserConfigurationException e) { e.printStackTrace();   }   
      catch (SAXException e) { e.printStackTrace(); }   
      catch (IOException e) { e.printStackTrace(); }  
        
      Node encomendas = doc.getFirstChild();  
                        
      Node encomenda = doc.createElement("encomenda");  
      Attr id = doc.createAttribute("id");  
      id.setValue("" + pedido);  
      NamedNodeMap encomendaAttributes = encomenda.getAttributes();  
      encomendaAttributes.setNamedItem(id);  
                
      Node local = doc.createElement("local");  
      local.setTextContent(localizacao);  
        
      Node estado = doc.createElement("estado");  
      estado.setTextContent(status);  
        
      Node momento = doc.createElement("momento");  
      momento.setTextContent(datahora);  
        
         
      encomenda.appendChild(local);  
      encomenda.appendChild(estado);  
      encomenda.appendChild(momento);  
        
      encomendas.appendChild(encomenda);  
        
      Transformer transformer = null;  
        
      try {  
          transformer = TransformerFactory.newInstance().newTransformer();  
      }   
      catch (TransformerConfigurationException e1) { e1.printStackTrace(); }   
      catch (TransformerFactoryConfigurationError e1) { e1.printStackTrace(); }  
        
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");  
      //initialize StreamResult with File object to save to file  
      StreamResult result = null;  
        
      try {  
          result = new StreamResult(new FileWriter(new File("/home/arquivos/TFG/projeto/PDA/encomendas.xml")));  
      } catch (IOException e1) {  
          e1.printStackTrace();  
      }  
        
      DOMSource source = new DOMSource(doc);  
        
      try {  
          transformer.transform(source, result);  
      }   
      catch (TransformerException e) { e.printStackTrace(); }
    

    }

// MÉTODO PARA EXCLUIR

public boolean excluir(String id){
    boolean resultado = false;
    
    
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();  
     DocumentBuilder docBuilder = null;  
     Document doc = null;;  
       
     try {  
       
         docBuilder = docFactory.newDocumentBuilder();  
         doc = docBuilder.parse("/home/arquivos/TFG/projeto/PDA/encomendas.xml");  
           
     }   
     catch (ParserConfigurationException e) { e.printStackTrace();   }   
     catch (SAXException e) { e.printStackTrace(); }   
     catch (IOException e) { e.printStackTrace(); }  
       
     Node encomenda = doc.getElementById(id);  
    try {
        doc.removeChild(encomenda);
        
        resultado = true;
        }
        catch (DOMException e) { e.printStackTrace(); }
     
     
     
     return resultado;
    }

}

Por eu não entender realmente como realmente o JAVA funciona com XML não sei o que devo fazer para que o meu método excluir funcione. Peço que os feras do java desse portal para que por favor me ajudem pois eu preciso disso para o meu trabalho final de graduação.
Pode ser de qualquer forma desde que eu passe um id e o metodo exclua o filho que possua aquele id, pode ser utilizando o jdom ou qualquer outra classe.

Para pesquisar eu possuo o seguinte métofo:

Este método carrega uma matriz chamada arquivo, onde nessa matriz eu carrego para para a memória contendo os registros do xml e efetuo pesquisa posteriormente.

public void pesquisar(){
File f = new File("/home/arquivos/TFG/projeto/PDA/encomendas.xml");

//Criamos uma classe SAXBuilder que vai processar o XML4
SAXBuilder sb = new SAXBuilder();

//Este documento agora possui toda a estrutura do arquivo.

try {
Document d = sb.build(f);

//Recuperamos o elemento root

Element encomendas = d.getRootElement();

//Recuperamos os elementos filhos (children)

List elements = encomendas.getChildren();

Iterator i = elements.iterator();
//setTitle(""+elements.size());

//Iteramos com os elementos filhos, e filhos do dos filhos

while (i.hasNext()) {
Element element = (Element) i.next();
       
                arquivo[cont][0] =  ""+element.getAttributeValue("id");
                arquivo[cont][1] =  ""+element.getChildText("estado");
                arquivo[cont][2] =  ""+element.getChildText("local");
                arquivo[cont][3] =  ""+element.getChildText("momento");
                      
                cont ++;
                }
}

catch (JDOMException e) { e.printStackTrace(); }

//catch (JDOMParseException e) { e.printStackTrace(); }

catch (IOException e) { e.printStackTrace(); }

}
os imports necessários para que este método funcione são

import java.io.File;

import java.io.IOException;

//import java.lang.reflect.Array;

import java.util.Iterator;

import java.util.List;

import org.jdom.Document;

import org.jdom.Element;

import org.jdom.JDOMException;

import org.jdom.input.SAXBuilder;

Pessoal, se irmos a fundo neste caso podemos construir uma classe ossuindo metodos bem definido, para inserir, editar, excluir e pesquisar em um xml. Procurei por vários sites e nenhum tinha uma explicação objetiva de como efetuar a exclusão de um filho ou alteração de um nó em um caso semelhante a este meu. Se alguém souber e postar as devidas explicações aqui, agradeço desde já. Obrigado!

4 Respostas

Z

Usa Xstream, vc carregaria uma lista de encomendas e passaria a id que quer remover, removeria esse elemento da sua lista e salvaria em xml denovo.

F

Muito obrigado pela dica, vou pesquisar sobre o assunto.

F

Senhores, de uma outra maneira desenvolvi o método para excluir, basicamente leio o arquivo e gravo novamente em xml, na hora de gravar comparo se o id é diferente daquele filho que eu queria excluir, segue o código do método abaixo:

public boolean excluir(String id){

Element encomendas = new Element("encomendas");
	//Define Agenda como root
	Document documento = new Document(encomendas);
            
            File f = new File(caminho);

//Criamos uma classe SAXBuilder que vai processar o XML4
SAXBuilder sb = new SAXBuilder();

//Este documento agora possui toda a estrutura do arquivo.

try {
Document d = sb.build(f);

//Recuperamos o elemento root

Element encomendas_atual = d.getRootElement();

//Recuperamos os elementos filhos (children)

List elements = encomendas_atual.getChildren();

Iterator i = elements.iterator();

String id_at = “”;

String estado_at="";

String local_at = “”;

String momento_at="";
//Iteramos com os elementos filhos, e filhos do dos filhos

while (i.hasNext()) {

Element element = (Element) i.next();
 
                
                estado_at =  ""+element.getChildText("estado");
                local_at =  ""+element.getChildText("local");
                momento_at =  ""+element.getChildText("momento");
        id_at = ""+element.getAttributeValue("id");
          if (id_at.equals(id)==false){
            //Cria o elemento encomenda
	Element encomenda = new Element("encomenda");
	//Adiciona o atributo id a encomenda
	encomenda.setAttribute("id",id_at);
	//Criando os elementos de contato
	Element local = new Element("local");
	local.setText(local_at);
	Element estado = new Element("estado");
	estado.setText(estado_at);
	Element momento = new Element("momento");
	momento.setText(momento_at);
	
            //Adicionando novamente elementos encomenda, local, estado e momento
	encomenda.addContent(local);
	encomenda.addContent(estado);
	encomenda.addContent(momento);
	
	//Adicionado o encomenda a lista de encomendas
	encomendas.addContent(encomenda);
            }      
                

                }
}

catch (JDOMException e) { e.printStackTrace(); }

//catch (JDOMParseException e) { e.printStackTrace(); }

catch (IOException e) { e.printStackTrace(); }
//Classe responsável para imprimir / gerar o XML
	XMLOutputter xout = new XMLOutputter();
	try {
		//Criando o arquivo de saida
		FileWriter arquivo = new FileWriter(new File(caminho));
		//Imprimindo o XML no arquivo
		xout.output(documento, arquivo);
                    return true;
                } catch (IOException e) {
                        return false;
		}	
	
}

Segue em anexo as duas classes que desenvolvi para manipular o xml.

Manipulaarquivo: possui metodos para pesquisar(selecionar), retornar o número de registros e excluir.
a manipulaarquivo2 possui um metódo para inserir no arquivo xml de forma incremental.

Agora falta apenas um método para alterar, posso fazer um da mesma forma que fiz para o metodo de exclusão mas creio que não seja este o caminho, dei uma olha pelo foruns e sei que deve ter uma maneira mais direta de realizar isto. Vejam os tópicos abaixo:

Ou veja esta postagem do guj:
http://www.guj.com.br/posts/list/489.java
Aqui só falaram mas não postaram um método por completo de como fazer uma bendita alteração(update)

Se alguém puder me ajudar com um exemplo fico eternamente grato.

F

Você poderia colocar seus códigos entre as tags [ code ] e [/ code ] para facilitar a leitura…

Criado 20 de fevereiro de 2008
Ultima resposta 9 de jun. de 2011
Respostas 4
Participantes 3