我试图在libxml2中找到一种结构,函数或宏,使我可以访问xmlNode的路径组件。例如,如果xmlGetNodePath返回/xml/a/b/c[42],我在哪里可以得到位置(42)或类似b的组件?

谢谢!

最佳答案

这是您的解决方案(仅当我正确回答您的问题时)。
请根据您的要求进行检查。

// XMLParse.cpp:定义控制台应用程序的入口点。
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/tree.h>
/*
 * A person record
 */
typedef struct person {
    char *name;
    char *email;
    char *company;
    char *organisation;
    char *smail;
    char *webPage;
    char *phone;
} person, *personPtr;

/*
 * a Description for a Job
 */
typedef struct job {
    char *projectID;
    char *application;
    char *category;
    personPtr contact;
    int nbDevelopers;
    personPtr developers[100]; /* using dynamic alloc is left as an exercise */
} job, *jobPtr;

/*
 * And the code needed to parse it
 */
personPtr parsePerson(xmlDocPtr doc, xmlNodePtr cur) {
    personPtr ret = NULL;

//DEBUG("parsePerson\n");
    /*
     * allocate the struct
     */
    ret = (personPtr) malloc(sizeof(person));
    if (ret == NULL) {
        fprintf(stderr,"out of memory\n");
        return(NULL);
    }
    memset(ret, 0, sizeof(person));

    /* We don't care what the top level element name is */
    cur = cur->xmlChildrenNode;
    while (cur != NULL) {
        if ((!strcmp(cur->name, "Person")) )
            ret->name = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        if ((!strcmp(cur->name, "Email")) )
            ret->email = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        cur = cur->next;
    }

    return(ret);
}

/*
 * And the code needed to parse it
 */
jobPtr parseJob(xmlDocPtr doc, xmlNodePtr cur) {
    jobPtr ret = NULL;

//DEBUG("parseJob\n");
    /*
     * allocate the struct
     */
    ret = (jobPtr) malloc(sizeof(job));
    if (ret == NULL) {
        fprintf(stderr,"out of memory\n");
        return(NULL);
    }
    memset(ret, 0, sizeof(job));

    /* We don't care what the top level element name is */
    cur = cur->xmlChildrenNode;
    cur = cur->next;
    cur = cur->xmlChildrenNode;
    cur = cur->next;
    cur = cur->xmlChildrenNode;
    while (cur != NULL) {

        if ((!strcmp(cur->name, "Project")) ) {
            ret->projectID = xmlGetProp(cur, "ID");
            if (ret->projectID == NULL) {
                fprintf(stderr, "Project has no ID\n");
            }
        }
        if ((!strcmp(cur->name, "Application")) )
            ret->application = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        if ((!strcmp(cur->name, "Category")) )
            ret->category = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
        if ((!strcmp(cur->name, "Contact")) )
            ret->contact = parsePerson(doc,cur);
        cur = cur->next;
    }

    return(ret);
}

int main(int argc, char* argv[])
{
    jobPtr mainret = NULL;
    xmlDocPtr doc;
    xmlNodePtr cur;
    doc = xmlParseFile("D://XMLParser/XMLParser1.0/comman/bin/myxml.xml");
    if (doc == NULL ) {
         fprintf(stderr,"Document not parsed successfully. \n");
         return 0;
    }
    cur = xmlDocGetRootElement(doc);
    if (cur == NULL) {
        fprintf(stderr,"empty document\n");
        xmlFreeDoc(doc);
        return 0;
    }

    mainret = parseJob(doc,cur);

    xmlFreeDoc(doc);

    return 0;
}


检查它,让我知道我是否错了。

关于c - xmlNode路径组件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17967194/

10-14 11:15
查看更多