Modificar archivo XML con xPath

Quiero modificar un archivo XML existente usando xPath. Si el nodo no existe, debe crearse (junto con sus padres si es necesario). Un ejemplo:

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

Y aquí hay un par de xPaths que quiero insertar / modificar:

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

El archivo XML debería verse así después:

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

Intenté esto:

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();
}

El nodo se cambia en el archivo después de ejecutar este código. Exactamente lo que yo quería. Pero si uso uno de los siguientes caminos,node es nulo (y por lo tanto unNullPointerException es aventado):

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

¿Cómo puedo cambiar este código para que se creen los nodos (y también los nodos principales no existentes)?

EDITAR: Ok, para aclarar: tengo un conjunto de parámetros que quiero guardar en XML. Durante el desarrollo, este conjunto puede cambiar (algunos parámetros se agregan, otros se mueven, otros se eliminan). Así que básicamente quiero tener una función para escribir el conjunto actual de parámetros en un archivo ya existente. Debería anular los parámetros que ya existen en el archivo, agregar nuevos parámetros y dejar los parámetros antiguos allí.

Lo mismo para la lectura, podría tener el xPath o alguna otra coordenada y obtener el valor del XML. Si no existe, devuelve la cadena vacía.

No tengo ninguna restricción sobre cómo implementarlo, xPath, DOM, SAX, XSLT ... Debe ser fácil de usar una vez que se escribe la funcionalidad (como la solución de BeniBela).

Así que si tengo los siguientes parámetros para configurar:

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

El resultado debe ser el XML inicial + esos parámetros. Si ya existen en esa xPath, se reemplazan, de lo contrario, se insertan en ese punto.

Respuestas a la pregunta(4)

Su respuesta a la pregunta