libxml2库 读取xml文件,写xml文件

前端之家收集整理的这篇文章主要介绍了libxml2库 读取xml文件,写xml文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

所用xml文件内容

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <style name="file">
  3. <contents name="type">
  4. <content>.mp3</content>
  5. <content>.mp4</content>
  6. <content>.wma</content>
  7. <content>.mkv</content>
  8. <content>.avi</content>
  9. </contents>
  10. <check>-2852</check>
  11. </style>

XmlReader.h实现功能,得到一个xml文件中的全部内容以及效验xml文件的有效性!


  1. #include <string>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <list>
  5. #include <libxml/xmlmemory.h>
  6. #include <libxml/parser.h>
  7.  
  8.  
  9. class XmlReader
  10. {
  11. public:
  12. XmlReader();
  13. ~XmlReader();
  14.  
  15.  
  16. std::list<std::string> getAllContent(std::string filename);
  17. bool checkXml(std::string filename);
  18.  
  19. private:
  20. int checkMethod(const char* content);
  21.  
  22. private:
  23. xmlDocPtr m_doc;
  24. xmlNodePtr m_node;
  25. xmlChar* m_nodeContent;
  26.  
  27. };


XmlReader.cpp内容


  1. #include "XmlReader.h"
  2. #include <cstring>
  3. #include <iostream>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. XmlReader::XmlReader()
  9. : m_doc(NULL),m_node(NULL),m_nodeContent(NULL)
  10. {
  11.  
  12. }
  13. XmlReader::~XmlReader()
  14. {
  15.  
  16. }
  17.  
  18. list<string> XmlReader::getAllContent(std::string filename)
  19. {
  20. const char *docname = filename.c_str();
  21. xmlKeepBlanksDefault(0);
  22. m_doc = xmlParseFile(docname);
  23.  
  24. if(m_doc == NULL){
  25. fprintf(stderr,"Document not parse successfully. \n");
  26. }
  27.  
  28. /* obtain root node */
  29. m_node = xmlDocGetRootElement(m_doc);
  30. if(m_node == NULL){
  31. fprintf(stderr,"empty document\n");
  32. xmlFreeDoc(m_doc);
  33. }
  34.  
  35. m_node = m_node->xmlChildrenNode;
  36. m_node = m_node->xmlChildrenNode;
  37.  
  38. list<string> fileType;
  39. char* type;
  40. while (NULL != m_node) {
  41. type = (char*)xmlNodeGetContent(m_node);
  42. string strType(type);
  43. fileType.push_back(strType);
  44.  
  45. m_node = m_node->next;
  46. }
  47.  
  48. return fileType;
  49. }
  50.  
  51. bool XmlReader::checkXml(std::string filename)
  52. {
  53. const char *docname = filename.c_str();
  54. xmlKeepBlanksDefault(0);
  55. m_doc = xmlParseFile(docname);
  56.  
  57. if(m_doc == NULL){
  58. fprintf(stderr,"Document not parse successfully. \n");
  59. }
  60.  
  61. /* obtain root node */
  62. m_node = xmlDocGetRootElement(m_doc);
  63. if(m_node == NULL){
  64. fprintf(stderr,"empty document\n");
  65. xmlFreeDoc(m_doc);
  66. }
  67.  
  68. //read xml file content
  69. m_node = m_node->xmlChildrenNode;
  70. m_nodeContent = xmlNodeGetContent(m_node);
  71. cout << "content:" << m_nodeContent << endl;
  72. int contentVal = checkMethod((const char*)m_nodeContent);
  73.  
  74. //read check content
  75. while (NULL != m_node->next) {
  76. m_node = m_node->next;
  77. }
  78. m_nodeContent = xmlNodeGetContent(m_node);
  79. cout << "check val:" << m_nodeContent << endl;
  80. int checkVal = atoi((const char*)m_nodeContent);
  81.  
  82. if (!(contentVal + checkVal)) {
  83. return true;
  84. }
  85.  
  86. return false;
  87.  
  88. }
  89.  
  90. int XmlReader::checkMethod(const char* content)
  91. {
  92. int length = strlen(content);
  93. int checkNum = 0;
  94. for (int i = 0; i < length; ++i)
  95. {
  96. /* code */
  97. checkNum += content[i];
  98. }
  99.  
  100. return checkNum;
  101. }


运行结果:

  1. linux:~/workspace/xml/testxml$ g++ -o testxml.out testxml.cpp XmlReader.cpp -I/usr/include/libxml2/ -lxml2
  2. linux:~/workspace/xml/testxml$ ./testxml.out
  3. .mp3
  4. .mp4
  5. .wma
  6. .mkv
  7. .avi
  8. content:.mp3.mp4.wma.mkv.avi
  9. check val:-2852
  10. 0
  11. linux:~/workspace/xml/testxml$


写xml文件

XmlWriter.h文件。实现功能
fileTypeWrite函数向xml文件中加入新的节点,然后checkValWrite计算所有contents节点下面的字符的每个字节的和,之后取反。

这里用到的是xmlReadFile读取,而没有用xmlParseFile,因为前者在写入时,可以写入回车字符,在使用xmlSaveFormatFile保存文件时,注意第三个参数设置为1。

  1. #include <string>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <list>
  5. #include <libxml/xmlmemory.h>
  6. #include <libxml/parser.h>
  7.  
  8.  
  9. class XmlWriter
  10. {
  11. public:
  12. XmlWriter();
  13. ~XmlWriter();
  14.  
  15.  
  16. void fileTypeWrite(std::string filename,const char* type);
  17. bool checkValWrite(std::string filename);
  18.  
  19. private:
  20. int checkVal(const char* content);
  21.  
  22. private:
  23. xmlDocPtr m_doc;
  24. xmlNodePtr m_node;
  25. xmlChar* m_nodeContent;
  26.  
  27. };

XmlWriter.cpp文件内容
  1. #include <cstring>
  2. #include <iostream>
  3. #include <stdlib.h>
  4.  
  5. #include "XmlWriter.h"
  6.  
  7. using namespace std;
  8.  
  9. XmlWriter::XmlWriter()
  10. : m_doc(NULL),m_nodeContent(NULL)
  11. {
  12.  
  13. }
  14.  
  15. XmlWriter::~XmlWriter()
  16. {
  17.  
  18. }
  19.  
  20. void XmlWriter::fileTypeWrite(std::string filename,const char* type)
  21. {
  22. const char *docname = filename.c_str();
  23. //xmlKeepBlanksDefault(0);
  24. //m_doc = xmlParseFile(docname);
  25. m_doc = xmlReadFile(docname,NULL,XML_PARSE_NOBLANKS | XML_PARSE_NODICT);
  26.  
  27. if(m_doc == NULL){
  28. fprintf(stderr,"empty document\n");
  29. xmlFreeDoc(m_doc);
  30. }
  31.  
  32. m_node = m_node->xmlChildrenNode;
  33.  
  34. xmlNodePtr nodePtr = NULL;
  35. nodePtr = xmlNewTextChild(m_node,(const xmlChar*)"content",(const xmlChar*)type);
  36. if (NULL == nodePtr) {
  37. fprintf(stderr,"add node Failed\n");
  38. }
  39.  
  40.  
  41. if (m_doc != NULL) {
  42. //xmlSaveFormatFile(filename,doc,0);
  43. xmlSaveFormatFile (filename.c_str(),m_doc,1);
  44. xmlFreeDoc(m_doc);
  45. }
  46.  
  47. }
  48.  
  49. bool XmlWriter::checkValWrite(std::string filename)
  50. {
  51. const char *docname = filename.c_str();
  52. //xmlKeepBlanksDefault(0);
  53. //m_doc = xmlParseFile(docname);
  54. m_doc = xmlReadFile(docname,XML_PARSE_NOBLANKS | XML_PARSE_NODICT);
  55.  
  56. if(m_doc == NULL){
  57. fprintf(stderr,"empty document\n");
  58. xmlFreeDoc(m_doc);
  59. }
  60.  
  61. m_node = m_node->xmlChildrenNode;
  62. // while (NULL != m_node->next) {
  63. // m_node = m_node->next;
  64. // }
  65.  
  66. m_nodeContent = xmlNodeGetContent(m_node);
  67. cout << "content val:" << m_nodeContent << endl;
  68. int checkValue = -checkVal((const char*)m_nodeContent);
  69. char* chVal = new char[100];
  70. sprintf(chVal,"%d",checkValue);
  71.  
  72.  
  73. cout << chVal << endl;
  74.  
  75.  
  76. cout << "===========================" << endl;
  77.  
  78. m_node = xmlDocGetRootElement(m_doc);
  79.  
  80. m_node = m_node->xmlChildrenNode;
  81. while (NULL != m_node->next) {
  82. m_node = m_node->next;
  83. }
  84.  
  85. if ((!xmlStrcmp(m_node->name,(const xmlChar *)"check"))) {
  86. xmlNodeSetContent(m_node,(const xmlChar*)chVal);
  87. } else {
  88. m_node = xmlDocGetRootElement(m_doc);
  89. xmlNodePtr nodePtr = NULL;
  90. nodePtr = xmlNewTextChild(m_node,(const xmlChar*)"check",(const xmlChar*)chVal);
  91. if (NULL == nodePtr) {
  92. fprintf(stderr,"add check value Failed\n");
  93. }
  94. }
  95.  
  96.  
  97.  
  98. delete []chVal;
  99.  
  100. if (m_doc != NULL) {
  101. //xmlSaveFormatFile(docname,0);
  102. xmlSaveFormatFile (docname,1);
  103. xmlFreeDoc(m_doc);
  104. }
  105.  
  106. }
  107.  
  108. int XmlWriter::checkVal(const char* content)
  109. {
  110. int length = strlen(content);
  111. int checkNum = 0;
  112. for (int i = 0; i < length; ++i)
  113. {
  114. /* code */
  115. checkNum += content[i];
  116. }
  117.  
  118. return checkNum;
  119. }


运行结果:

  1. linux:~/workspace/xml/testxml$ g++ -o testxml.out testxml.cpp XmlWriter.cpp -I/usr/include/libxml2/ -lxml2
  2. linux:~/workspace/xml/testxml$ ./testxml.out
  3. content val:.mp3.mp4.wma.mkv.avi.avi
  4. -2120
  5. ===========================
  6. linux:~/workspace/xml/testxml$

Write完之后的xml文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <style name="file">
  3. <contents name="type">
  4. <content>.mp3</content>
  5. <content>.mp4</content>
  6. <content>.wma</content>
  7. <content>.mkv</content>
  8. <content>.avi</content>
  9. <content>.avi</content>
  10. </contents>
  11. <check>-2120</check>
  12. </style>

猜你在找的XML相关文章