<?xml version="1.0" encoding="utf-8"?> <style name="file"> <contents name="type"> <content>.mp3</content> <content>.mp4</content> <content>.wma</content> <content>.mkv</content> <content>.avi</content> </contents> <check>-2852</check> </style>
XmlReader.h实现功能,得到一个xml文件中的全部内容以及效验xml文件的有效性!
#include <string> #include <iostream> #include <stdio.h> #include <list> #include <libxml/xmlmemory.h> #include <libxml/parser.h> class XmlReader { public: XmlReader(); ~XmlReader(); std::list<std::string> getAllContent(std::string filename); bool checkXml(std::string filename); private: int checkMethod(const char* content); private: xmlDocPtr m_doc; xmlNodePtr m_node; xmlChar* m_nodeContent; };
XmlReader.cpp内容:
#include "XmlReader.h" #include <cstring> #include <iostream> using namespace std; XmlReader::XmlReader() : m_doc(NULL),m_node(NULL),m_nodeContent(NULL) { } XmlReader::~XmlReader() { } list<string> XmlReader::getAllContent(std::string filename) { const char *docname = filename.c_str(); xmlKeepBlanksDefault(0); m_doc = xmlParseFile(docname); if(m_doc == NULL){ fprintf(stderr,"Document not parse successfully. \n"); } /* obtain root node */ m_node = xmlDocGetRootElement(m_doc); if(m_node == NULL){ fprintf(stderr,"empty document\n"); xmlFreeDoc(m_doc); } m_node = m_node->xmlChildrenNode; m_node = m_node->xmlChildrenNode; list<string> fileType; char* type; while (NULL != m_node) { type = (char*)xmlNodeGetContent(m_node); string strType(type); fileType.push_back(strType); m_node = m_node->next; } return fileType; } bool XmlReader::checkXml(std::string filename) { const char *docname = filename.c_str(); xmlKeepBlanksDefault(0); m_doc = xmlParseFile(docname); if(m_doc == NULL){ fprintf(stderr,"Document not parse successfully. \n"); } /* obtain root node */ m_node = xmlDocGetRootElement(m_doc); if(m_node == NULL){ fprintf(stderr,"empty document\n"); xmlFreeDoc(m_doc); } //read xml file content m_node = m_node->xmlChildrenNode; m_nodeContent = xmlNodeGetContent(m_node); cout << "content:" << m_nodeContent << endl; int contentVal = checkMethod((const char*)m_nodeContent); //read check content while (NULL != m_node->next) { m_node = m_node->next; } m_nodeContent = xmlNodeGetContent(m_node); cout << "check val:" << m_nodeContent << endl; int checkVal = atoi((const char*)m_nodeContent); if (!(contentVal + checkVal)) { return true; } return false; } int XmlReader::checkMethod(const char* content) { int length = strlen(content); int checkNum = 0; for (int i = 0; i < length; ++i) { /* code */ checkNum += content[i]; } return checkNum; }
运行结果:
linux:~/workspace/xml/testxml$ g++ -o testxml.out testxml.cpp XmlReader.cpp -I/usr/include/libxml2/ -lxml2 linux:~/workspace/xml/testxml$ ./testxml.out .mp3 .mp4 .wma .mkv .avi content:.mp3.mp4.wma.mkv.avi check val:-2852 0 linux:~/workspace/xml/testxml$
写xml文件:
XmlWriter.h文件。实现功能:
fileTypeWrite函数向xml文件中加入新的节点,然后checkValWrite计算所有contents节点下面的字符的每个字节的和,之后取反。
这里用到的是xmlReadFile读取,而没有用xmlParseFile,因为前者在写入时,可以写入回车字符,在使用xmlSaveFormatFile保存文件时,注意第三个参数设置为1。
#include <string> #include <iostream> #include <stdio.h> #include <list> #include <libxml/xmlmemory.h> #include <libxml/parser.h> class XmlWriter { public: XmlWriter(); ~XmlWriter(); void fileTypeWrite(std::string filename,const char* type); bool checkValWrite(std::string filename); private: int checkVal(const char* content); private: xmlDocPtr m_doc; xmlNodePtr m_node; xmlChar* m_nodeContent; };
XmlWriter.cpp文件内容:
#include <cstring> #include <iostream> #include <stdlib.h> #include "XmlWriter.h" using namespace std; XmlWriter::XmlWriter() : m_doc(NULL),m_nodeContent(NULL) { } XmlWriter::~XmlWriter() { } void XmlWriter::fileTypeWrite(std::string filename,const char* type) { const char *docname = filename.c_str(); //xmlKeepBlanksDefault(0); //m_doc = xmlParseFile(docname); m_doc = xmlReadFile(docname,NULL,XML_PARSE_NOBLANKS | XML_PARSE_NODICT); if(m_doc == NULL){ fprintf(stderr,"empty document\n"); xmlFreeDoc(m_doc); } m_node = m_node->xmlChildrenNode; xmlNodePtr nodePtr = NULL; nodePtr = xmlNewTextChild(m_node,(const xmlChar*)"content",(const xmlChar*)type); if (NULL == nodePtr) { fprintf(stderr,"add node Failed\n"); } if (m_doc != NULL) { //xmlSaveFormatFile(filename,doc,0); xmlSaveFormatFile (filename.c_str(),m_doc,1); xmlFreeDoc(m_doc); } } bool XmlWriter::checkValWrite(std::string filename) { const char *docname = filename.c_str(); //xmlKeepBlanksDefault(0); //m_doc = xmlParseFile(docname); m_doc = xmlReadFile(docname,XML_PARSE_NOBLANKS | XML_PARSE_NODICT); if(m_doc == NULL){ fprintf(stderr,"empty document\n"); xmlFreeDoc(m_doc); } m_node = m_node->xmlChildrenNode; // while (NULL != m_node->next) { // m_node = m_node->next; // } m_nodeContent = xmlNodeGetContent(m_node); cout << "content val:" << m_nodeContent << endl; int checkValue = -checkVal((const char*)m_nodeContent); char* chVal = new char[100]; sprintf(chVal,"%d",checkValue); cout << chVal << endl; cout << "===========================" << endl; m_node = xmlDocGetRootElement(m_doc); m_node = m_node->xmlChildrenNode; while (NULL != m_node->next) { m_node = m_node->next; } if ((!xmlStrcmp(m_node->name,(const xmlChar *)"check"))) { xmlNodeSetContent(m_node,(const xmlChar*)chVal); } else { m_node = xmlDocGetRootElement(m_doc); xmlNodePtr nodePtr = NULL; nodePtr = xmlNewTextChild(m_node,(const xmlChar*)"check",(const xmlChar*)chVal); if (NULL == nodePtr) { fprintf(stderr,"add check value Failed\n"); } } delete []chVal; if (m_doc != NULL) { //xmlSaveFormatFile(docname,0); xmlSaveFormatFile (docname,1); xmlFreeDoc(m_doc); } } int XmlWriter::checkVal(const char* content) { int length = strlen(content); int checkNum = 0; for (int i = 0; i < length; ++i) { /* code */ checkNum += content[i]; } return checkNum; }
运行结果:
linux:~/workspace/xml/testxml$ g++ -o testxml.out testxml.cpp XmlWriter.cpp -I/usr/include/libxml2/ -lxml2 linux:~/workspace/xml/testxml$ ./testxml.out content val:.mp3.mp4.wma.mkv.avi.avi -2120 =========================== linux:~/workspace/xml/testxml$
Write完之后的xml文件:
<?xml version="1.0" encoding="utf-8"?> <style name="file"> <contents name="type"> <content>.mp3</content> <content>.mp4</content> <content>.wma</content> <content>.mkv</content> <content>.avi</content> <content>.avi</content> </contents> <check>-2120</check> </style>