Inserir, editar, excluir e pesquisar em um xml

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 java.io.;
import java.util.
;
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!

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.

Muito obrigado pela dica, vou pesquisar sobre o assunto.

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.

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