Antony
Antony

Reputation: 976

MarkLogic - How to insert element into XML

How to insert the node in XML.

let $a := <a><b>bbb</b></a>)
return
      xdmp:node-insert-after(doc("/example.xml")/a/b, <c>ccc</c>);

Expected Output:

<a><c>ccc</c><b>bbb</b></a>

Please help to get the output.

Upvotes: 1

Views: 884

Answers (3)

SHUBHAM PATIDAR
SHUBHAM PATIDAR

Reputation: 51

You can use below code to insert the element into the XML:

xdmp:node-insert-child(fn:doc('directory URI'),element {fn:QName('http://yournamesapce','elementName') }{$elementValue})

Here we use fn:QName to remove addition of xmlns="" in added node.

Upvotes: 0

ehennum
ehennum

Reputation: 7335

Nodes are immutable, so in-memory mutation can only be done by creating a new copy.

The copy can use the unmodified contained nodes from the original:

declare function local:insert-after(
    $prior as node(),
    $inserted as node()+
) as element()
{
    let $container := $prior/parent::element()
    return element {fn:node-name($container)} {
        $container/namespace::*,
        $container/attribute(),
        $prior/preceding-sibling::node(),
        $prior,
        $inserted,
        $prior/following-sibling::node()
    }
};

let $a := <a><b>bbb</b></a>
return local:insert-after($a//b, <c>ccc</c>)

Creating a copy in memory and then inserting the copy is faster than inserting and modifying a document in the database.

Depending on how many documents are inserted, the difference could be significant.

There are community libraries for copying with changes, but sometimes it's as easy to write a quick function (recursive where necessary).

Upvotes: 1

Tamas
Tamas

Reputation: 11214

You should be using xdmp:node-insert-before I believe in the following way:

xdmp:document-insert('/example.xml', <a><b>bbb</b></a>);

xdmp:node-insert-before(fn:doc('/example.xml')/a/b, <c>ccc</c>);

fn:doc('/example.xml');

(: returns <a><c>ccc</c><b>bbb</b></a> :)

Upvotes: 1

Related Questions