3
votes

I'm reading in an XML file using XQuery and want to insert several nodes/elements and generate a new XML file. How can I accomplish this?

I've tried using the replace() function, but, it looks like all my XML tags are being stripped when I call doc() to load my document. So calling replace() isn't any good if my XML tags are being removed.

Any help? Are there other technologies I can use?

3
Do you have to use XQuery to insert nodes? - vtd-xml-author
It would be useful to know what XQuery implementation you are using. - tboerman
Preferably. What would you suggest? - CoolGravatar

3 Answers

4
votes

An extension to the XQuery language allowing updates -- the XQuery Update Facility -- exists to allow documents to be modified.

Inserting a node looks like this:

insert node <foo>bar</foo>
  into /bar//baz[id='qux']

Among other engines, this is supported by BaseX.

See http://www.w3.org/TR/xquery-update-10/

1
votes

Using XQuery Scripting you can write programs like this:

variable $stores := doc("stores.xml")/stores;

insert node element store { 
  element store-number { 4 },
  element state { "CA" }
} into $stores;

$stores

You can try such example live at http://www.zorba-xquery.com/html/demo#vpshT+pVURyQSCEOKrFBrF0jyGY=

0
votes

replace() is a string operation, so the XML will be converted to a string before replacement.

To create a modified copy of the original file, you can modify an identity transformation which recursively copies the original file to insert the new nodes where required - see the article in the XQuery Wikibook

Alternatively if the file is in an XML database such as eXist, you can use update operations to insert elements in situ.