A wrapper around the DOM interface of libxml2. The standard way to use it is as follows: #include ... // open a document NXml::TDocument xml("filename.xml"); // get a nodeset from an XPath query NXml::TConstNodes nodes = xml.Root().Nodes("xpath/expression/here"); // iterate over the nodeset for (size_t i = 0; i < nodes.size(); ++i) { using namespace NXml; TConstNode& node = nodes[i]; // query node TString name = node.Name(); TString lang = node.Attr("lang"); TString text = node.Value(); TConstNode child = node.GetFirstChild(""); // edit node TNode node = child.ConstCast(); node.DelAttr("id"); node.SetAttr("x", 2); node.SetValue(5); node.AddText(" apples"); } // edit documents with copy-paste NXml::TDocument xml2("", NXml::TDocument::String); NXml::TNode place = xml2.Root().Node("xpath/node"); // copy node's subtree from one document to another place.AddChild(xml.Root()); // save (render) single element TString modifiedNode = place.ToString(); // save whole document with optional encoding TString modifiedDoc = xml2.ToString("ISO-8559-1"); See xml-document_ut.cpp for more examples.