To illustrate document modification, we will:
Retrieve a document named "doc1.xml" from a container.
Rename an attribute node called 'attr1' to 'myAttribute'.
Add a child node called "newChild" to node "node2".
Remove a node called "removeNode".
Update the contents of attribute node 'myAttribute' with the string "replacement content".
The document that we will update is as follows:
<sampleDocument> <node1 attr1="an attribute node" /> <removeNode>Some content to remove</removeNode> <node2 /> </sampleDocument>
Notice that in performing the modification, we are not required to explicitly save the modified document back into the container; that is done for us under the covers.
package dbxml.gettingStarted; import com.sleepycat.dbxml.XmlContainer; import com.sleepycat.dbxml.XmlDocument; import com.sleepycat.dbxml.XmlException; import com.sleepycat.dbxml.XmlManager; import com.sleepycat.dbxml.XmlModify; import com.sleepycat.dbxml.XmlUpdateContext; import com.sleepycat.dbxml.XmlQueryContext; import com.sleepycat.dbxml.XmlQueryExpression; import com.sleepycat.dbxml.XmlValue; ... XmlManager myManager = null; XmlContainer myContainer = null; ... try { // Get a manager object. myManager = new XmlManager(); // Open a container myContainer = myManager.openContainer("exampleData.dbxml"); XmlQueryContext qc = myManager.createQueryContext(); XmlUpdateContext uc = myManager.createUpdateContext(); XmlModify mod = myManager.createModify(); // Build the modification object. // Rename the attribute node from 'attr1' to 'myAttribute'. XmlQueryExpression select = myManager.prepare("/sampleDocument/node1/@attr1", qc); mod.addRenameStep(select, "myAttribute"); // Add '<newChild>' node to '<node2>' String newChildContent = "<c1>some content</c1>"; select = myManager.prepare("/sampleDocument/node2", qc); mod.addAppendStep(select, XmlModify.Element, "newChild", newChildContent); // Remove <removeNode> from the document select = myManager.prepare("/sampleDocument/removeNode", qc); mod.addRemoveStep(select); // Replace the contents of /sampleDocument/node1/@myAttribute. Notice // the attribute was renamed from attr1 in the first step of this // modification. Modifications are performed in the specified order. String attrContent = "replacement content"; select = myManager.prepare("/sampleDocument/node1/@myAttribute", qc); mod.addUpdateStep(select, attrContent); // Now retrieve the document we want to modify from the container. // Notice that we could have performed a query against the container, // and then handed the entire result set to this method. In that case, // every document contained in the result set is modified. XmlDocument retDoc = myContainer.getDocument("doc1.xml"); XmlValue docValue = new XmlValue(retDoc); mod.execute(docValue, qc, uc); // Show that the modification was performed // and written to the container. XmlDocument retDoc2 = myContainer.getDocument("doc1.xml"); String mssg = retDoc2.getName() + ":\n"; mssg += retDoc2.getContentAsString(); System.out.println(mssg); select.delete(); mod.delete(); qc.delete(); } catch (XmlException e) { // Error handling goes here. } finally { try { if (myContainer != null) { myContainer.close(); } if (myManager != null) { myManager.close(); } } catch (XmlException ce) { // Exception handling goes here }
When we run this code, the program displays the modified document which is now:
doc1.xml: <sampleDocument> <node1 myAttribute="replacement content" /> <node2><newChild><c1>some content</c1></newChild></node2> </sampleDocument>