#include #include #include mxml_type_t type_cb(mxml_node_t *node) { const char *type; type = mxmlElementGetAttr(node, "type"); if (type == NULL) type = mxmlGetElement(node); if (!strcmp(type, "integer")) return (MXML_INTEGER); else if (!strcmp(type, "opaque")) return (MXML_OPAQUE) ; else if (!strcmp(type, "real")) return (MXML_REAL); else return (MXML_TEXT); } int process(FILE *f) { mxml_node_t *root, *node, *next; const char* elename; root = mxmlLoadFile(NULL, f, MXML_TEXT_CALLBACK); elename = mxmlGetElement(root); if (elename) printf("%s\n", elename); node = mxmlFindElement(root, root, "title-group", NULL, NULL, MXML_DESCEND); elename = mxmlGetElement(node); if (elename) printf("%s\n", elename); while ((next = mxmlWalkNext(node, root, MXML_DESCEND))) { elename = mxmlGetElement(next); if (elename) { printf("%s\n", elename); if (!strcmp(elename, "article-title")) { next = mxmlWalkNext(next, root, MXML_DESCEND); mxml_type_t t = mxmlGetType(next); printf("T %d\n", t); if (t == MXML_TEXT) { printf("IS TEXT %d\n", t); } const char* txt = mxmlGetText(next, NULL); if (txt) printf("article-title txt: %s\n", txt); } } node = next; } return 0; } int main(int argc, char *argv[]) { FILE *f; for (int i = 0; i < argc; i++) { f = fopen(argv[i], "r"); process(f); fclose(f); } return 0; }