21xrx.com
2024-12-27 21:12:50 Friday
登录
文章检索 我的文章 写文章
C++读写XML文件
2023-06-27 12:11:26 深夜i     --     --
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文件的常用方法,开发人员可以根据实际需求选择最适合自己的读写方法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复