diff --git a/src/opnsense/mvc/app/models/OPNsense/Base/BaseModel.php b/src/opnsense/mvc/app/models/OPNsense/Base/BaseModel.php index 9de21cd3eb..21d9674871 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Base/BaseModel.php +++ b/src/opnsense/mvc/app/models/OPNsense/Base/BaseModel.php @@ -752,7 +752,15 @@ abstract class BaseModel * e.g. /system/user should place new entries at /system **/ $pxpath = implode("/", array_slice(explode("/", $xpath), 0, -1)); - $toDom = dom_import_simplexml($target_node->xpath($pxpath)[0]); + $target = $target_node->xpath($pxpath); + if (empty($target)) { + /* target doesn't exist yet, create the root node by traversing the tree (starting inside /opnsense) */ + $target = $target_node; + foreach (array_slice(explode("/", trim($xpath, "/")), 1, -1) as $p) { + $target = count($target_node->xpath($p)) == 0 ? $target->addChild($p) : $target->xpath($p)[0]; + } + } + $toDom = dom_import_simplexml($target[0]); foreach ($newNodes as $node) { if ($node !== null) { $toDom->appendChild($toDom->ownerDocument->importNode($node, true));