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.
#include "DbXml.hpp"
...
using namespace DbXml;
...
// Get a manager object.
XmlManager myManager;
// Open a container
XmlContainer 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>'
std::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.
std::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(retDoc);
mod.execute(docValue, qc, uc);
// Show that the modification was performed
// and written to the container.
XmlDocument retDoc2 = myContainer.getDocument("doc1.xml");
std::string doc1String;
std::cout << retDoc2.getName() << ":\n"
<< retDoc2.getContent(doc1String)
<< "\n\n" << std::endl;
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>