Изменить XML-файл с помощью xPath

Я хочу изменить существующий файл XML с помощью xPath. Если узел не существует, он должен быть создан (вместе с его родителями, если это необходимо). Пример:

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

И вот пара xPath, которые я хочу вставить / изменить:

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

Файл XML должен выглядеть следующим образом:

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

Я попробовал это:

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

Узел изменяется в файле после запуска этого кода. Именно то, что я хотел. Но если я использую один из следующих путей,node&nbsp;является нулевым (и, следовательно,NullPointerException&nbsp;брошен)

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

Как я могу изменить этот код, чтобы создать узел (и несуществующие родительские узлы)?

EDIT: Хорошо, чтобы уточнить: у меня есть набор параметров, которые я хочу сохранить в XML. В процессе разработки этот набор может изменяться (некоторые параметры добавляются, некоторые перемещаются, некоторые удаляются). Поэтому я в основном хочу иметь функцию для записи текущего набора параметров в уже существующий файл. Он должен переопределить параметры, которые уже существуют в файле, добавить новые параметры и оставить там старые параметры.

То же самое для чтения, я мог бы просто иметь xPath или некоторые другие координаты и получить значение из XML. Если он не существует, он возвращает пустую строку.

У меня нет никаких ограничений относительно того, как его реализовать, xPath, DOM, SAX, XSLT ... Это должно быть просто, как только функциональность будет написана (как решение BeniBela).

Так что, если у меня есть следующие параметры для установки:

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

результатом должен быть начальный XML + эти параметры. Если они уже существуют в этом xPath, они заменяются, в противном случае они вставляются в этот момент.