用于C的XMLparsing器

你能build议一些最好的XMLparsing器的C?

两个最广泛使用的parsing器是Expat和libxml 。

如果你可以使用C ++,也可以使用Xerces-C ++ 。

expat和libxml2的两个例子。 第二个是恕我直言,因为它在内存中创build了一棵树,这个数据结构很容易使用,所以使用起来更容易。 另一方面,expat不会构build任何东西(你必须自己做),它只是允许你在parsing过程中的特定事件中调用处理程序。 但外派可能会更快(我没有测量)。

用expat,读取一个XML文件并显示这些元素的缩进:

/* A simple test program to parse XML documents with expat <http://expat.sourceforge.net/>. It just displays the element names. On Debian, compile with: gcc -Wall -o expat-test -lexpat expat-test.c Inspired from <http://www.xml.com/pub/a/1999/09/expat/index.html> */ #include <expat.h> #include <stdio.h> #include <string.h> /* Keep track of the current level in the XML tree */ int Depth; #define MAXCHARS 1000000 void start(void *data, const char *el, const char **attr) { int i; for (i = 0; i < Depth; i++) printf(" "); printf("%s", el); for (i = 0; attr[i]; i += 2) { printf(" %s='%s'", attr[i], attr[i + 1]); } printf("\n"); Depth++; } /* End of start handler */ void end(void *data, const char *el) { Depth--; } /* End of end handler */ int main(int argc, char **argv) { char *filename; FILE *f; size_t size; char *xmltext; XML_Parser parser; if (argc != 2) { fprintf(stderr, "Usage: %s filename\n", argv[0]); return (1); } filename = argv[1]; parser = XML_ParserCreate(NULL); if (parser == NULL) { fprintf(stderr, "Parser not created\n"); return (1); } /* Tell expat to use functions start() and end() each times it encounters * the start or end of an element. */ XML_SetElementHandler(parser, start, end); f = fopen(filename, "r"); xmltext = malloc(MAXCHARS); /* Slurp the XML file in the buffer xmltext */ size = fread(xmltext, sizeof(char), MAXCHARS, f); if (XML_Parse(parser, xmltext, strlen(xmltext), XML_TRUE) == XML_STATUS_ERROR) { fprintf(stderr, "Cannot parse %s, file may be too large or not well-formed XML\n", filename); return (1); } fclose(f); XML_ParserFree(parser); fprintf(stdout, "Successfully parsed %i characters in file %s\n", size, filename); return (0); } 

使用libxml2是一个显示根元素名称和子元素名称的程序:

 /* Simple test with libxml2 <http://xmlsoft.org>. It displays the name of the root element and the names of all its children (not descendents, just children). On Debian, compiles with: gcc -Wall -o read-xml2 $(xml2-config --cflags) $(xml2-config --libs) \ read-xml2.c */ #include <stdio.h> #include <string.h> #include <libxml/parser.h> int main(int argc, char **argv) { xmlDoc *document; xmlNode *root, *first_child, *node; char *filename; if (argc < 2) { fprintf(stderr, "Usage: %s filename.xml\n", argv[0]); return 1; } filename = argv[1]; document = xmlReadFile(filename, NULL, 0); root = xmlDocGetRootElement(document); fprintf(stdout, "Root is <%s> (%i)\n", root->name, root->type); first_child = root->children; for (node = first_child; node; node = node->next) { fprintf(stdout, "\t Child is <%s> (%i)\n", node->name, node->type); } fprintf(stdout, "...\n"); return 0; } 

如何用纯汇编编写:-)不要忘记检查基准 。

你可以尝试ezxml – 这是一个完全用C编写的轻量级parsing器。

对于C ++,你可以检查出TinyXML ++

http://www.minixml.org也不错。; 小而且只是ANSI C.

外籍人相当体面。 没有更多的信息,很难给出好的build议。

你能否指出你在写什么平台? 这应该重在什么是“最好的”。 你可能会发现一个超级的'xml-foo'库,在大多数系统上默认情况下都是不通用的。虽然库很好,但缺less库可能会阻止(或者至less)惹恼用户。

大多数情况下,我使用libxml2 ..因为它的标准或易于安装在我的目标平台上。

正如你所看到的,“最好的”也取决于目标平台上可用的库。

我个人的偏好是libxml2 。 这是非常容易使用,但我从来没有打扰它的基准,因为我只用它的configuration文件parsing。

对于C ++,我build议使用CMarkup 。

在Windows上,它是本机与Win32 API …