c语言读写xml文件
时间: 2025-03-13 12:04:06 浏览: 68
### C语言中XML文件的读写操作
在C语言中,可以通过第三方库来实现对XML文件的解析和写入功能。常见的用于处理XML文件的C语言库有 **libxml2** 和 **Expat** 等[^3]。
#### 使用 libxml2 进行 XML 文件的读取
`libxml2` 是一个强大的开源库,支持多种平台,并提供了丰富的API来进行XML文档的操作。以下是通过 `libxml2` 库读取XML文件的一个简单示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
void read_xml(const char *filename) {
xmlDocPtr doc;
xmlNodePtr root_node;
// 解析XML文件并获取文档对象
doc = xmlReadFile(filename, NULL, 0);
if (doc == NULL ) {
fprintf(stderr,"Document not parsed successfully.\n");
return;
}
// 获取根节点
root_node = xmlDocGetRootElement(doc);
if (root_node->type == XML_ELEMENT_NODE) {
printf("Root element : %s\n", root_node->name);
}
// 遍历子节点
xmlNodePtr cur_node = NULL;
for (cur_node = root_node->children; cur_node; cur_node = cur_node->next) {
if (cur_node->type == XML_ELEMENT_NODE) {
printf("Element name: %s\n", cur_node->name);
xmlChar *key_value = xmlNodeListGetString(doc, cur_node->children, 1);
printf("Content of node is %s\n", key_value);
xmlFree(key_value);
}
}
// 清理资源
xmlFreeDoc(doc);
}
int main(int argc, char const *argv[]) {
const char* filename = "example.xml";
read_xml(filename);
return 0;
}
```
上述代码展示了如何利用 `libxml2` 来打开、解析以及遍历XML文件的内容。
#### 使用 Expat 实现简单的XML解析
另一个常用的轻量级库是 `Expat`,它专注于事件驱动式的XML解析方式。下面是一个基于 `Expat` 的基本例子:
```c
#include <expat.h>
#include <stdio.h>
#include <string.h>
static void start_element(void *data, const char *element_name, const char **attr) {
printf("Start Element: '%s'\n", element_name);
}
static void end_element(void *data, const char *element_name) {
printf("End Element: '%s'\n", element_name);
}
static void character_data(void *data, const char *characters, int length) {
printf("Character Data: '%.*s'\n", length, characters);
}
void parse_file(const char *file_path) {
FILE *fp = fopen(file_path, "r");
if (!fp) {
perror("fopen failed:");
exit(EXIT_FAILURE);
}
fseek(fp, 0L, SEEK_END);
long file_size = ftell(fp);
rewind(fp);
char *buffer = malloc((size_t)(file_size + 1));
fread(buffer, sizeof(char), (size_t)file_size, fp);
fclose(fp);
buffer[file_size] = '\0';
XML_Parser parser = XML_ParserCreate(NULL);
XML_SetElementHandler(parser, start_element, end_element);
XML_SetCharacterDataHandler(parser, character_data);
if (XML_Parse(parser, buffer, strlen(buffer), XML_TRUE) == XML_STATUS_ERROR) {
fprintf(stderr,
"Parse error at line %" PRIu64 ": %s\n",
XML_GetCurrentLineNumber(parser),
XML_ErrorString(XML_GetErrorCode(parser)));
}
free(buffer);
XML_ParserFree(parser);
}
int main() {
const char *file_path = "test.xml";
parse_file(file_path);
return 0;
}
```
这段代码演示了如何使用 `Expat` 处理解析器回调函数以捕获开始标记、结束标记及字符数据等内容。
### 总结
无论是采用 `libxml2` 或者 `Expat`,都可以有效地完成C语言下的XML文件读写任务。前者更适合复杂的DOM模型应用场合;而后者则适用于流式的数据处理场景,在内存占用方面表现更优。
阅读全文
相关推荐


















