xml转c 语言结构体,如何编写通用的C函数来将xml解析为结构体?

我有一组xml数据文件,表示我想要解析的图像(矩形,点,标记的面等)中感兴趣的对象,以生成结构的向量.手动创建文件(因此不仅仅是序列化某些C对象的结果),并且具有以下形式:

1

2

3

4

...

所以一组图像,每个图像都包含一个对象子集合,每个对象子节点都有子节点提供与该对象相关的数据.该数据的结构因文件而异,例如在一个文件中,每个对象可能只有一个x和一个y,而在另一个文件中,每个对象可能包含整数x1,y1,x2,y2和一个双z.

我想解析这样一个文件来生成一个Objects的向量,其中Object是一个struct,在这种情况下是struct Object {int x; int y; }.

对于Object的不同选择,我目前有单独的函数使用rapidxml以相同的方式解析xml,除了它们提取的字段.

我想编写一个模板化函数,这样你只需要以某种方式指定结构的元素,并让函数返回适当结构的向量.即用户应指定对的列表(“x1”,int),(“x2”,int)等,并自动完成其余工作.

我确信必须有一个很好的增强解决方案来解决这个问题,避免使用XML模式.我该怎么做呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用开源的库来解析 XML 文件并将其换为 C 语言结构体。一个常用的库是 libxml2。 以下是一个简单的示例代码,演示如何使用 libxml2 解析 XML 文件并将其换为结构体: ```c #include <stdio.h> #include <libxml/parser.h> struct Person { char name[50]; int age; char address[100]; }; void parseXml(const char* xmlFile, struct Person* person) { xmlDocPtr doc; xmlNodePtr rootNode, node; // 打开 XML 文件 doc = xmlReadFile(xmlFile, NULL, 0); if (doc == NULL) { printf("无法打开 XML 文件\n"); return; } // 获取根节点 rootNode = xmlDocGetRootElement(doc); if (rootNode == NULL) { printf("XML 文件为空\n"); xmlFreeDoc(doc); return; } // 遍历子节点 for (node = rootNode->children; node != NULL; node = node->next) { if (node->type == XML_ELEMENT_NODE) { xmlChar* content = xmlNodeGetContent(node); if (xmlStrcmp(node->name, (const xmlChar*)"name") == 0) { snprintf(person->name, sizeof(person->name), "%s", content); } else if (xmlStrcmp(node->name, (const xmlChar*)"age") == 0) { person->age = atoi((const char*)content); } else if (xmlStrcmp(node->name, (const xmlChar*)"address") == 0) { snprintf(person->address, sizeof(person->address), "%s", content); } xmlFree(content); } } // 释放资源 xmlFreeDoc(doc); xmlCleanupParser(); } int main() { struct Person person; parseXml("person.xml", &person); printf("Name: %s\n", person.name); printf("Age: %d\n", person.age); printf("Address: %s\n", person.address); return 0; } ``` 在上面的示例中,我们定义了一个名为 `Person` 的结构体,用于存储从 XML 文件中解析出的数据。`parseXml` 函数使用 libxml2 库来解析 XML 文件,并将解析结果保存到 `Person` 结构体中。 你需要根据你的 XML 文件的实际结构和字段名称来修改代码中的相关部分。 请注意,在使用 libxml2 库之前,你需要先安装它并在编译时链接该库。具体的安装和链接步骤根据你使用的操作系统和编译环境而定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值