+sub find_or_make_node {
+ my($xc, $path, $recursion_level) = @_;
+
+ die "deep recursion in find_or_make_node($path)"
+ if $recursion_level == 10;
+
+ my @nodes = $xc->findnodes($path);
+ if (@nodes == 0) {
+ # Oh dear, the parent node doesn't exist. We could make it,
+ my($ppath, $element) = $path =~ /(.*)\/(.*)/;
+ warn "no node '$path': making it";
+ my $parent = find_or_make_node($xc, $ppath, $recursion_level-1);
+
+ my(undef, $prefix, $nsElem) = $element =~ /((.*?):)?(.*)/;
+ my $new = new XML::LibXML::Element($nsElem);
+ $new->setNamespace(irspy_namespace($prefix), $prefix)
+ if $prefix ne "";
+
+ $parent->appendChild($new);
+ return $new;
+ }
+ warn scalar(@nodes), " nodes match parent '$path'" if @nodes > 1;
+ return $nodes[0];
+}
+
+