所用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>