C中XML字符串的高效解析

Efficient parsing of XML strings in C

我需要解析 APIC 中返回的 XML 编码字符串,并查找特定标签及其值。实现这一目标的最有效方法是什么?我不能使用非标准库或像 Boost 这样的第三方库。

如果是简单的一次性值提取,您可以使用字符串函数(strstr() 等)并根据 XML 元素顺序嵌套它们。它不会很漂亮,但应该可以正常工作。

如果您需要更通用的东西,您将在多个应用程序中使用它,并且需要处理变量 XML 输入、XPath 等,您最好编写自己的通用 XML解析器。您可以自己编写或使用 Bison and Flex.

旁白:我不确定为什么您不能使用第三方库 - MIT 许可证非常宽松且最合法部门很高兴将其用于商业软件。老实说,编写您自己的 XML 解析器会很痛苦 - libxml 以前就已经存在并且做得很好(好吧,XML 解析器也可以工作...)。

我在课程中做到了。

您应该使用链表来解析您的文档。

我的方法(这种方法非常有效)是首先在开头的“<”之后直接解析 char*,然后遍历所有内容,直到找到结尾的“>”。将每个单词放入一个数组是个好主意。

这意味着,您在此之前阅读的所有内容都与数组中的第一个 char * 相关联。

之后,您只需再解析 2 个东西,即属性及其值。属性以'='结尾,这意味着从前面的space字符到这个'='符号,是属性,'='字符后面的所有内容到下一个'',都是它的值.

<model name="Homo sapiens Glycolysis" id="Pathway146">

这里,"model"是标签,"name"是属性,"Homo sapiens Glycolysis"是它的值。

然后,当您成功解析这些字符串后,填写您的链表。每个节点都是一个新标签。

这样,当要求查找特定字段时,只需(从开头)到最后遍历您的列表,搜索特定标签、属性或值。 找到后,显示整个节点。

这是我的 .h,如果它有帮助的话。

typedef struct   s_elem {
  char           *tag;
  char           **attributes;
  char           **values;
  struct s_elem  *next;
  struct s_elem  *prev;
} t_elem;

typedef struct   s_list {
  struct s_elem  *first;
  struct s_elem  *last;
} t_list;

这不是唯一的方法。您可以将属性及其值存储到单个字符串中,但您必须打印它以处理 '='.

希望对您有所帮助。