Q:

Existe alternativa para vários loops whiles?

Possuo um método alterar() que alterar os dados de um determinado elemento do meu XML Pessoa, entretanto, esta rotina usa vários whiles um para cada elemento, veja abaixo a rotina:
public void alterar() {                 
    try {
        Document doc = parse(arquivo);                        
        
        List<Node> nos = doc.selectNodes("//pessoas/pessoa[idpessoa='" + String.valueOf(idPessoa) + "']");
        
        for (Node no: nos) {
            Element elemPessoa = (Element) no;
            
            Iterator<Element> itrIdPessoa = elemPessoa.elementIterator("idpessoa");
            
            while (itrIdPessoa.hasNext()) { 
                Element elemIdPessoa = (Element) itrIdPessoa.next();
                elemIdPessoa.setText(String.valueOf(idPessoa));
            }
            
            Iterator<Element> itrNome = elemPessoa.elementIterator("nome");
            
            while (itrNome.hasNext()) { 
                Element elemNome = (Element) itrNome.next();
                elemNome.setText(nome);
            }
            
            Iterator<Element> itrEmail = elemPessoa.elementIterator("email");
            
            while (itrEmail.hasNext()) { 
                Element elemEmail = (Element) itrEmail.next();
                elemEmail.setText(email);
            }
            
            Iterator<Element> itrCelular = elemPessoa.elementIterator("celular");
                            
            while (itrCelular.hasNext()) { 
                Element elemCelular = (Element) itrCelular.next();
                elemCelular.setText(celular);
            }
        }
                    
        escrever(doc, arquivo);
    }                 
    catch (DocumentException ex) {
        throw new RuntimeException();
    } 
    catch (IOException ex) {
        throw new RuntimeException();
    }        
    catch (NoClassDefFoundError ex) { 
        System.err.println("Erro: " + ex.getMessage());
    }
}    

Esta é a estrutura do arquivo XML Pessoa:
<?xml version="1.0" encoding="UTF-8"?>
<pessoas>
   <pessoa>
      <idpessoa>2</idpessoa>
      <nome>Marcielli teste</nome>
      <email>mah@mail.com</email>
      <celular>88888888</celular>
   </pessoa>
   <pessoa>
      <idpessoa>3</idpessoa>
      <nome>Ana</nome>
      <email>ana@mail.com</email>
      <celular>1233121</celular>
   </pessoa>
</pessoas>

Dúvida
Eu gostaria de saber se possível, se existe alguma alternativa para todos esses whiles?
PS: Estou usando a biblioteca dom4j para processar e ler o arquivo XML.

A:

Tudo que existe um certo padrão é possível abstrair e tornar o código genérico. Então é possível criar um método que faça esse código de forma genérica "preenchendo as lacunas" que são especializadas. Exemplo (não necessariamente o melhor):
private void FillElements(Node no, String nomeNo, String valor) {
    Element elemPessoa = (Element)no;
    Iterator<Element> iterador = elemPessoa.elementIterator(nomeNo);
    while (iterador.hasNext()) { 
        Element elemento = (Element)iterador.next();
        elemento.setText(valor);
    }
}

Usando:
FillElements(no, "idpessoa", String.valueOf(idPessoa)) //preenche as lacunas
FillElements(no, "nome", nome)
FillElements(no, "email", email)
FillElements(no, "celular", celular)

Coloquei no GitHub para referência futura.
Não estou entrando no mérito se o código está correto e faz o desejado ou se está bem escrito e poderia ser melhor, até por não saber o contexto completo, só estou mostrando como generalizar o código postado e evitar repetição.
Isso pode ser considerado DRY.

