21xrx.com
2025-06-30 15:19:49 Monday
文章检索 我的文章 写文章
C++读写XML文件
2023-06-27 12:11:26 深夜i     20     0
C++ XML 文件

XML(Extensible Markup Language)是一种用于数据交换的标记语言。在计算机科学领域中,XML文件是一种常用的文件格式,同时它也是一种通用的数据格式。C++是一种高级编程语言,提供了各种读取和写入XML文件的库。

C++中读取XML文件有两种常用的方式:SAX和DOM模型。SAX模型是一种基于事件的模型,它以流的形式读取XML文件,在遇到元素时触发相应的事件。SAX模型可以用于处理大型XML文档,因为它不会一次性将整个XML文档加载到内存中。使用SAX模型需要编写回调函数,这些函数在读取XML文件时会被调用。

DOM模型是一种基于对象的模型,可以将整个XML文件加载到内存中,并将XML文件的每个元素映射到一个DOM树上的节点。DOM模型提供了一种更容易的方式来访问XML文件中的元素和属性。使用DOM模型需要解析整个XML文件,因此对于大型XML文件而言,它可能会占用大量的内存。

以下为使用SAX模型读取XML文件的示例代码:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <stack>
#include <map>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
using namespace std;
static void start_element_handler(void *user_data, const xmlChar *element, const xmlChar **attribute)
  // 处理元素开始
static void end_element_handler(void *user_data, const xmlChar *element)
  // 处理元素结束
int main()
{
  // 读取XML文件
  xmlDocPtr doc = xmlReadFile("test.xml", NULL, 0);
  if (doc == NULL)
    cerr << "Error: Could not read XML file." << endl;
    return 1;
  
  // 获取root节点
  xmlNodePtr root = xmlDocGetRootElement(doc);
  // 遍历节点
  xmlNodePtr node = NULL;
  for (node = root->children; node != NULL; node = node->next) {
    // 处理节点
    xmlSAXHandler sax_handler = {0};
    sax_handler.startElement = start_element_handler;
    sax_handler.endElement = end_element_handler;
    xmlSAXUserParseMemory(&sax_handler, NULL, (const char *)xmlNodeGetContent(node), strlen((const char *)xmlNodeGetContent(node)));
  }
  xmlFreeDoc(doc);
  xmlCleanupParser();
  return 0;
}

以下为使用DOM模型读取XML文件的示例代码:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <stack>
#include <map>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
using namespace std;
int main()
{
  // 读取XML文件
  xmlDocPtr doc = xmlReadFile("test.xml", NULL, 0);
  if (doc == NULL)
    cerr << "Error: Could not read XML file." << endl;
    return 1;
  
  // 获取root节点
  xmlNodePtr root = xmlDocGetRootElement(doc);
  // 遍历节点
  xmlNodePtr node = NULL;
  for (node = root->children; node != NULL; node = node->next) {
    // 处理节点
    xmlChar *content = xmlNodeGetContent(node);
    cout << "Content: " << content << endl;
    xmlFree(content);
  }
  xmlFreeDoc(doc);
  xmlCleanupParser();
  return 0;
}

写入XML文件同样可以使用SAX和DOM模型。在使用SAX模型时,需要在回调函数中生成XML文件的标记。在使用DOM模型时,需要创建XML文档树,并将节点和属性添加到XML文档树中。

以下为使用DOM模型写入XML文件的示例代码:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <stack>
#include <map>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
using namespace std;
int main()
{
  // 创建XML文档树
  xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
  xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "data");
  xmlDocSetRootElement(doc, root);
  // 创建节点
  xmlNodePtr node1 = xmlNewNode(NULL, BAD_CAST "name");
  xmlNodePtr node2 = xmlNewNode(NULL, BAD_CAST "age");
  // 设置节点属性
  xmlNewProp(node1, BAD_CAST "gender", BAD_CAST "male");
  // 设置节点内容
  xmlNodeSetContent(node1, BAD_CAST "Tom");
  xmlNodeSetContent(node2, BAD_CAST "23");
  // 将节点添加到XML文档树
  xmlDocSetRootElement(doc, root);
  xmlAddChild(root, node1);
  xmlAddChild(root, node2);
  // 写入XML文件
  xmlSaveFormatFileEnc("test.xml", doc, "UTF-8", 1);
  xmlFreeDoc(doc);
  xmlCleanupParser();
  return 0;
}

以上是使用C++读写XML文件的常用方法,开发人员可以根据实际需求选择最适合自己的读写方法。

  
  

评论区