xerces C/C++ 读取XML文件的一个小事例
xerces C/C++ 读取XML文件的一个小例子
main.cpp
#include <xercesc/util/PlatformUtils.hpp> #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/dom/DOM.hpp> #include <xercesc/sax/HandlerBase.hpp> #include <xercesc/util/XMLString.hpp> #include <iostream> // Other include files, declarations, and non-Xerces-C++ initializations. #pragma comment (lib,"xerces-c_3.lib") using namespace xercesc; using namespace std; int main() { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { // Do your failure processing here cout << "Initialize Error!" << endl; return 1; } // Do your actual work with Xerces-C++ here. XercesDOMParser* parser = new XercesDOMParser(); parser->setValidationScheme(XercesDOMParser::Val_Always); parser->setDoNamespaces(true); // optional ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase(); parser->setErrorHandler(errHandler); //此处请用绝对路径 char* xmlFile = "C:\\Users\\hp1\\Documents\\visual studio 2013\\Projects\\XMLParser\\Debug\\book.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 -2; } catch (const SAXException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); cout << "Exception message is: \n" << message << "\n"; XMLString::release(&message); return -3; } catch (...) { cout << "Unexpected Exception \n"; return -4; } //读取 DOMDocument* doc = parser->getDocument(); DOMNodeList* nodelist = doc->getChildNodes(); DOMNode* root; DOMNodeList* childlist; DOMNode* child; DOMNode* attr; DOMNodeList* attrs; //最外层的 books for (int i = 0; i < nodelist->getLength(); i++) { root = nodelist->item(i); char *nodename = XMLString::transcode(root->getNodeName()); cout << nodename << endl; XMLString::release(&nodename); if (root->hasChildNodes()) { childlist = root->getChildNodes(); //book for (int j = 1; j < childlist->getLength()-1; j+=2) { child = childlist->item(j); char *childname = XMLString::transcode(child->getNodeName()); cout << " " << childname << endl; XMLString::release(&childname); if (child->hasChildNodes()) { attrs = child->getChildNodes(); //name 等等 for (int k = 1; k < attrs->getLength()-1; k+=2) { attr = attrs->item(k); char *attrname = XMLString::transcode(attr->getNodeName()); char *attrvalue = XMLString::transcode(attr->getTextContent()); cout << " " << attrname << " : " << attrvalue << endl; XMLString::release(&attrname); XMLString::release(&attrvalue); } } } } } // int stop; cin >> stop; delete parser; delete errHandler; XMLPlatformUtils::Terminate(); // Other terminations and cleanup. return 0; }
book.xml
<?xml version="1.0" encoding="GB2312" standalone="no"?> <books> <book> <name>book1</name> <price>1.1</price> </book> <book> <name>book2</name> <price>2.2</price> </book> <book> <name>book3</name> <price>3.3</price> </book> </books>