Xerces C ++ - loading, reading and saving, alternatives?

I am looking for a tutorial to download an XML file, read it, modify it, and finally save it in C ++. I am using Linux Ubuntu and trying to use Xerces. With Google and many times I could only upload an XML file:

#include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/dom/DOM.hpp> #include <xercesc/sax/HandlerBase.hpp> #include <xercesc/util/XMLString.hpp> #include <xercesc/util/PlatformUtils.hpp> #include <iostream> using namespace std; using namespace xercesc; int main (int argc, char* args[]) { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); cout << "Error during initialization! :\n" << message << "\n"; XMLString::release(&message); return 1; } XercesDOMParser* parser = new XercesDOMParser(); parser->setValidationScheme(XercesDOMParser::Val_Always); parser->setDoNamespaces(true); // optional ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase(); parser->setErrorHandler(errHandler); const char* xmlFile = "demo.xml"; try { parser->parse(xmlFile); } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); cout << "Exception message is: \n" << message << "\n"; XMLString::release(&message); return -1; } catch (const DOMException& toCatch) { char* message = XMLString::transcode(toCatch.msg); cout << "Exception message is: \n" << message << "\n"; XMLString::release(&message); return -1; } catch (...) { cout << "Unexpected Exception \n" ; return -1; } DOMNode* docRootNode; // DOMNode* aNode; DOMDocument* doc; doc = parser->getDocument(); docRootNode = doc->getDocumentElement(); cout << docRootNode->getAttributes() << endl; //returns Hex delete parser; delete errHandler; return 0; } 

How can I read the manipulation of an XML file and finally save it? Are there any alternative libraries? (I tried tinyxml, but files return errors when I want to compile them)

+7
c ++ linux xml xerces
source share
5 answers

Sample for saving xerces DOMDocument. Saving a document with

 DOMLSSerializer::write(const DOMNode* nodeToWrite, DOMLSOutput* const destination) 

see code Example http://xerces.apache.org/xerces-c/domprint-2.html

  DOMLSSerializer * theSerializer = impl->createLSSerializer(); DOMPrintFilter *myFilter = new DOMPrintFilter(DOMNodeFilter::SHOW_ELEMENT | DOMNodeFilter::SHOW_ATTRIBUTE | DOMNodeFilter::SHOW_DOCUMENT_TYPE); theSerializer->setFilter(myFilter); DOMLSOutput *theOutputDesc = ((DOMImplementationLS*)impl)->createLSOutput(); XMLFormatTarget *myFormTarget = new LocalFileFormatTarget(XMLString::transcode("C:\\target.xml")); theOutputDesc->setByteStream(myFormTarget); theOutputDesc->setEncoding(XMLString::transcode("ISO-8859-1")); theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMXMLDeclaration, true); theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true); theSerializer->write(doc, theOutputDesc); myFormTarget->flush(); delete myFormTarget; theOutputDesc->release(); theSerializer->release(); 

And an example implementation of a filter. You can find this in the DOMPrint example.

 class DOMPrintFilter : public DOMLSSerializerFilter { public: DOMPrintFilter(ShowType whatToShow = DOMNodeFilter::SHOW_ALL); ~DOMPrintFilter(){}; virtual FilterAction acceptNode(const DOMNode*) const; virtual ShowType getWhatToShow() const {return fWhatToShow;}; private: // unimplemented copy ctor and assignement operator DOMPrintFilter(const DOMPrintFilter&); DOMPrintFilter & operator = (const DOMPrintFilter&); ShowType fWhatToShow; }; #include "DOMPrintFilter.hpp" #include <xercesc/util/XMLUniDefs.hpp> #include <xercesc/util/XMLString.hpp> static const XMLCh element_person[]= { chLatin_p, chLatin_e, chLatin_r, chLatin_s, chLatin_o, chLatin_n, chNull }; static const XMLCh element_link[]= { chLatin_l, chLatin_i, chLatin_n, chLatin_k, chNull }; DOMPrintFilter::DOMPrintFilter(ShowType whatToShow) :fWhatToShow(whatToShow) {} DOMNodeFilter::FilterAction DOMPrintFilter:: acceptNode(const DOMNode* node) const { // // The DOMLSSerializer shall call getWhatToShow() before calling // acceptNode(), to show nodes which are supposed to be // shown to this filter. // // REVISIT: In case the DOMLSSerializer does not follow the protocol, // Shall the filter honour, or NOT, what it claims // it is interested in ? // // The DOMLS specs does not specify that acceptNode() shall do // this way, or not, so it is up the implementation, // to skip the code below for the sake of performance ... // if ((getWhatToShow() & (1 << (node->getNodeType() - 1))) == 0) return DOMNodeFilter::FILTER_ACCEPT; switch (node->getNodeType()) { case DOMNode::ELEMENT_NODE: { // for element whose name is "person", skip it if (XMLString::compareString(node->getNodeName(), element_person)==0) return DOMNodeFilter::FILTER_SKIP; // for element whose name is "line", reject it if (XMLString::compareString(node->getNodeName(), element_link)==0) return DOMNodeFilter::FILTER_REJECT; // for rest, accept it return DOMNodeFilter::FILTER_ACCEPT; break; } case DOMNode::COMMENT_NODE: { // the WhatToShow will make this no effect return DOMNodeFilter::FILTER_REJECT; break; } case DOMNode::TEXT_NODE: { // the WhatToShow will make this no effect return DOMNodeFilter::FILTER_REJECT; break; } case DOMNode::DOCUMENT_TYPE_NODE: { // even we say we are going to process document type, // we are not able be to see this node since // DOMLSSerializerImpl (a XercesC default implementation // of DOMLSSerializer) will not pass DocumentType node to // this filter. // return DOMNodeFilter::FILTER_REJECT; // no effect break; } case DOMNode::DOCUMENT_NODE: { // same as DOCUMENT_NODE return DOMNodeFilter::FILTER_REJECT; // no effect break; } default : { return DOMNodeFilter::FILTER_ACCEPT; break; } } return DOMNodeFilter::FILTER_ACCEPT; } 
+2
source share

LibXML ++ seems to be the best for C ++. By and large, this is very complete, including XPath, encoding conversions (according to Glibmm) and everything you expect in an XML library. It uses the traditional DOM and SAX APIs, which are considered pro or console depending on who you ask from. One of the possible problems is that the library dependencies are extremely heavy (due to the use of Glibmm). However, it seems to be the only decent XML library for C ++.

http://libxmlplusplus.sourceforge.net/docs/manual/html/index.html

TinyXML does not parse XML according to the specification, so I would recommend against it, even if it works for simple documents.

+1
source share

The CreateDOMDocument sample that comes with Xerces shows you how to add nodes, etc. into a DOM document. The code that you are still creating the document, so you need to adapt the code in the second example to add nodes, attributes, etc.

Also note that when you say:

  cout << docRootNode->getAttributes() << endl; 

the getAttributes function returns a set of attributes - you need to apply additional Xerces functions to this collection to get the information contained.

Note that if you want to extract a subset of the data in an e XML file, it may be easier to use an event driven SAX parser (Xerces includes one of them) rather than creating and passing through a complete DOM document.

0
source share

If you want to see an example of how to do this with Xerces-C ++, check this code:

http://libprf1.tigris.org/files/documents/1338/13256/libprf1-0.1R3.tar.gz

I wrote this a long time ago as a university project. This is most likely based on an obsolete version of Xerces-C ++, but I don't think the API has changed too much to be a problem. This will at least give you an idea.

0
source share

The following link is a good tutorial that shows the basics for reading an XML file and analyzing it with XERCES.

http://www.yolinux.com/TUTORIALS/XML-Xerces-C.html

When this is done, the XERCES API should be sufficient for further operations:

http://xerces.apache.org/xerces-c/apiDocs-2/classes.html

To write (serialize) a document, the user of the DOMWriter class is http://xerces.apache.org/xerces-c/apiDocs-2/classDOMWriter.html#a0ddcef5fed6b49e03e53334fedca4b2

0
source share

All Articles