我需要在XML
中解析由API
返回的C
个编码字符串,并查找特定标记及其值。实现这一目标的最有效方法是什么?我不能使用非标准库或第三方库,如Boost。
答案 0 :(得分:1)
如果它是一个简单的一次性值提取,您可以使用字符串函数(strstr()
等)并根据您的XML元素顺序嵌套它们。它不会很漂亮,但应该可以正常工作。
如果你需要一些更通用的东西,你将在多个应用程序中使用并且需要处理变量XML输入,XPath等,那么你最好编写自己的通用XML解析器。您可以选择自己编写的路线,也可以使用Bison和Flex。
旁白:我不确定为什么你不能使用第三方图书馆 - 麻省理工学院的许可证是非常宽松的,大多数法律部门都很满意它被用于商业软件。说实话,编写自己的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需要付出很多不必要的努力。
最好将库用于此类标准化任务。