libxml2庫 讀取xml檔案,寫xml檔案
阿新 • • 發佈:2019-01-28
所用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> </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_node(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, "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;
xmlNodePtr nodePtr = NULL;
nodePtr = xmlNewTextChild(m_node, NULL, (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, NULL, XML_PARSE_NOBLANKS | XML_PARSE_NODICT);
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;
// 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, NULL, (const xmlChar*)"check", (const xmlChar*)chVal);
if (NULL == nodePtr) {
fprintf(stderr, "add check value failed\n");
}
}
delete []chVal;
if (m_doc != NULL) {
//xmlSaveFormatFile(docname, doc, 0);
xmlSaveFormatFile (docname, m_doc, 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>