Modifique o arquivo XML com o xPath

Eu quero modificar um arquivo XML existente usando o xPath. Se o nó não existir, ele deve ser criado (junto com seus pais, se necessário). Um exemplo:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <param0>true</param0>
  <param1>1.0</param1>
</configuration>

E aqui estão alguns xPaths que eu quero inserir / modificar:

/configuration/param1/text()         -> 4.0
/configuration/param2/text()         -> "asdf"
/configuration/test/param3/text()    -> true

O arquivo XML deve ficar assim depois:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <param0>true</param0>
  <param1>4.0</param1>
  <param2>asdf</param2>
  <test>
    <param3>true</param3>
  </test>
</configuration>

Eu tentei isso:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

try {
  DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
  Document doc = domFactory.newDocumentBuilder().parse(file.getAbsolutePath());
  XPath xpath = XPathFactory.newInstance().newXPath();

  String xPathStr = "/configuration/param1/text()";
  Node node = ((NodeList) xpath.compile(xPathStr).evaluate(doc, XPathConstants.NODESET)).item(0);
  System.out.printf("node value: %s\n", node.getNodeValue());
  node.setNodeValue("4.0");

  TransformerFactory transformerFactory = TransformerFactory.newInstance();
  Transformer transformer = transformerFactory.newTransformer();
  transformer.transform(new DOMSource(doc), new StreamResult(file));
} catch (Exception e) {
  e.printStackTrace();
}

O nó é alterado no arquivo após a execução deste código. Exatamente o que eu queria. Mas se eu usar um dos caminhos abaixo,node é nulo (e, portanto, umNullPointerException é lançado):

/configuration/param2/text()
/configuration/test/param3/text()

Como posso alterar esse código para que o nó (e nós pai não existentes também) sejam criados?

EDITAR: Ok, para esclarecer: eu tenho um conjunto de parâmetros que eu quero salvar em XML. Durante o desenvolvimento, este conjunto pode mudar (alguns parâmetros são adicionados, alguns são movidos, alguns são removidos). Então eu basicamente quero ter uma função para escrever o conjunto atual de parâmetros para um arquivo já existente. Ele deve substituir os parâmetros que já existem no arquivo, adicionar novos parâmetros e deixar os parâmetros antigos lá.

O mesmo para a leitura, eu poderia apenas ter o xPath ou algumas outras coordenadas e obter o valor do XML. Se não existir, retorna a string vazia.

Eu não tenho restrições sobre como implementá-lo, xPath, DOM, SAX, XSLT ... Ele deve ser fácil de usar assim que a funcionalidade for escrita (como a solução da BeniBela).

Então, se eu tiver os seguintes parâmetros para definir:

/configuration/param1/text()         -> 4.0
/configuration/param2/text()         -> "asdf"
/configuration/test/param3/text()    -> true

o resultado deve ser o XML inicial + esses parâmetros. Se eles já existirem nesse xPath, eles serão substituídos, caso contrário, eles serão inseridos nesse ponto.

questionAnswers(4)

yourAnswerToTheQuestion