在C

时间:2015-08-11 08:57:05

标签: c xml-parsing

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

3 个答案:

答案 0 :(得分:1)

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

如果你需要一些更通用的东西,你将在多个应用程序中使用并且需要处理变量XML输入,XPath等,那么你最好编写自己的通用XML解析器。您可以选择自己编写的路线,也可以使用BisonFlex

旁白:我不确定为什么你不能使用第三方图书馆 - 麻省理工学院的许可证是非常宽松的,大多数法律部门都很满意它被用于商业软件。说实话,编写自己的XML解析器会很痛苦 - libxml之前已经存在并且做得很好(好吧,以及XML解析器可以工作......)。

答案 1 :(得分:1)

我在课程中做到了。

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

我这样做的方式(这种方式非常有效)是在开头'<'后直接解析char *首先,然后,你会查看所有内容,直到找到结束'>'。将每个单词放入数组中都是一个好主意。

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

继续之后,您只需要解析另外两件事,即属性及其值。该属性以'='结尾,这意味着从前一个空格字符开始,直到这个'='符号为属性,'='char后面的所有内容都是下一个'',是它的值。

<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;

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

希望它有所帮助。

答案 2 :(得分:-1)

我不建议重新发明轮子。编写稳定的xml-parser需要付出很多不必要的努力。

最好将库用于此类标准化任务。