C용 XML 파서
C에 가장 적합한 XML 파서를 제안해 주시겠습니까?
expat과 libxml2의 2가지 예를 나타냅니다.두 번째는 IMHO입니다.메모리에 트리를 만들기 때문에 조작하기 쉬운 데이터 구조를 만들 수 있기 때문입니다.한편, expat 에서는, 아무것도 빌드 되지 않습니다(스스로 작성하지 않으면 안 됩니다).파싱 중에 특정 이벤트에서 핸들러를 호출할 수 있을 뿐입니다.하지만 (저는 측정하지 않았습니다) expat이 더 빠를 수 있습니다.
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;
}
순수한 어셈블러로 쓴 것은 어떨까요?-) 벤치마크 체크하는 것을 잊지 마세요.
가장 널리 사용되는 파서는 Expat과 libxml입니다.
C++를 사용해도 괜찮으시다면 Xerces-C++도 있습니다.
http://www.minixml.org도 꽤 좋습니다.작고 단순한 ANSI C.
저는 개인적으로 libxml2를 선호합니다.매우 사용하기 쉽지만 구성 파일 해석에만 사용해 본 적이 없기 때문에 벤치마킹할 필요가 없습니다.
ezxml을 사용해 보십시오.이것은 모두 C로 작성된 경량 파서입니다.
C++의 경우 TinyX를 확인하실 수 있습니다.ML++
Expat은 꽤 괜찮은데.하지만 더 많은 정보가 없으면 좋은 추천을 하기는 어렵습니다.
어떤 플랫폼을 위해 쓰시는지 알려주시겠습니까?이것은 '최선'이 무엇인지에 큰 무게를 두어야 한다.디폴트로는 대부분의 시스템에서 일반적으로 출하되지 않는 슈퍼 'xml-foo' 라이브러리가 발견될 수 있습니다.라이브러리의 부족이 사용자를 괴롭히는 것을 막을 수도 있습니다.
주로 사용하는 것은 libxml2 입니다.그 이유는 libxml2가 표준이기 때문입니다.
보시는 바와 같이 '최적'은 대상 플랫폼에서 사용할 수 있는 라이브러리에 의해서도 결정됩니다.
C++의 경우 CMarkup 사용을 권장합니다.
Windows 에서는 Win32 api가 네이티브입니다.
언급URL : https://stackoverflow.com/questions/399704/xml-parser-for-c
'programing' 카테고리의 다른 글
Vue JS 워처가 작동하지 않음 (0) | 2022.08.21 |
---|---|
v-if 표시에 값을 증가시키는 방법 (0) | 2022.08.21 |
어떻게 현재 화면 방향 갈 수 있나요? (0) | 2022.08.21 |
char *envp [ ]는 main() portable의 세 번째 인수입니까? (0) | 2022.08.21 |
Larabel의 VUE2 구성 요소 레지스터 (0) | 2022.08.21 |