Ajuda com XML

Bom estou fazendo um curso porém faltei nas aulas sobre XML e me passaram apenas o código e eu gostaria de entender, alguém poderia comentar o código para mim minuciosamente? Eu procurei algumas formas de manipular o XML mas mesmo assim nada explicito, eu gostaria de entender cada comando e a lógica por trás.

Segue os códigos:

public void grava(String v_nome, String v_telefone, String v_email) throws Exception {

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document doc = db.parse("agenda.xml"); 
    Element elem = doc.getDocumentElement();
    
    
    Element filho = doc.createElement("amigo"); 
    elem.appendChild(filho);
     
     Element tagNome = doc.createElement("nome"); 
     Text text = doc.createTextNode(v_nome); 
     tagNome.appendChild(text); 
     filho.appendChild(tagNome); 
     
     Element tagTel = doc.createElement("telefone"); 
     Text text1 = doc.createTextNode(v_telefone); 
     tagTel.appendChild(text1); 
     filho.appendChild(tagTel);
    
     Element tagEmail = doc.createElement("email"); 
     Text text2 = doc.createTextNode(v_email); 
     tagEmail.appendChild(text2); 
     filho.appendChild(tagEmail);
    
     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer trans = tf.newTransformer(); 
     
     FileWriter fw = new FileWriter("agenda.xml"); 
     StreamResult sr = new StreamResult(fw); 
     DOMSource recurso = new DOMSource(doc);
     trans.transform(recurso, sr);
     
     JOptionPane.showMessageDialog(null, "Dados cadastrados com sucesso !");
     
}

}

//-------------------------
public EntidadeXML busca(String pesnome) throws Exception {

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document doc = db.parse("agenda.xml"); 
    
    Element elem = doc.getDocumentElement();
    NodeList amigos = elem.getElementsByTagName("amigo"); 
    
    for(int i = 0; i< amigos.getLength();i++){
        
        Element filhos = (Element) amigos.item(i); 
        
        NodeList nome = filhos.getElementsByTagName("nome"); 
        Element tagnome  = (Element) nome.item(0); 
        String nomefilho = tagnome.getTextContent();
        
        NodeList tel = filhos.getElementsByTagName("telefone"); 
        Element tagtel  = (Element) tel.item(0); 
        String telfilho = tagtel.getTextContent();
        
        NodeList email = filhos.getElementsByTagName("email"); 
        Element tagemail  = (Element) email.item(0); 
        String emailfilho = tagemail.getTextContent();
        
        if(nomefilho.equalsIgnoreCase(pesnome)){
        //System.out.println(nomefilho+ "  " + telfilho + "  "+ emailfilho);
        
             EntidadeXML ex = new EntidadeXML(nomefilho,telfilho,emailfilho);
             et = ex;
        }
        
        
    }
    return et;

Se for contras as regras me avisem que eu apago.
Valeu!