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;
}
チェックして、間違っていたら教えてください。