解析XML文件的一部分

问题描述:

所以我现在已经停留了很长时间了。我使用libxml2,它对代码中的另一部分非常有用,但是我似乎无法想象这个问题,它让我像疯了似的。解析XML文件的一部分

我有这样的XML代码:

<MetaCommandSet> 
    <MetaCommand name="ChangeSystemInterval"> 
    <ArgumentList> 
     <Argument name="Interval" argumentTypeRef="UnsignedByteType"></Argument> 
    </ArgumentList> 
    </MetaCommand> 

现在,我想是的命令及其参数的名称。这意味着它必须留在相同的元命令中,以便我可以收集参数并将其保存到例如结构中。

代码片段:

for (cur_node = a_node; cur_node; cur_node = cur_node->next) 
    { 
    DATA TM_tmp; 
    COMMAND TC_tmp; 

    if(!xmlStrcmp(cur_node->name, "MetaCommand")) 
    { 
     TC_tmp.functionName = malloc(strlen((xmlGetProp(cur_node, "name") + 1))); 
     TC_tmp.functionName = xmlGetProp(cur_node, "name"); 
     printf("Name: %s\n",TC_tmp.functionName); 
     /* 
      It now needs to keep looping this so i get every argument but it cant find any childs after argumentList 

     */ 
    } 

    createArray(cur_node->children); 

我NOG进一步得到比获得元命令名称。我已经循环扔所有元素,如果它的MetaCommand元素,我想继续我上面所述。

请给我一些想法

+0

你可能会喜欢显示你卡在哪里的代码片段。 – alk

+0

不要看到这很重要,因为我几乎没有。但添加它编辑:增加:) – flexzican

+0

' - > next'成员指向该节点的下一个*兄弟*。您必须使用' - > children'来获取节点的第一个孩子。 – nwellnhof

取自我的一个源物理。你必须潜入一个水平比我深,我已经<定价> <价格AGE_GROUP = “”> < EUR> ... < /欧元> < /定价> < /价格>

{ 
while (cur != NULL) { 
    if (xmlStrcmp(cur->name, (const xmlChar *) "pricing") == 0) { 
    cur = cur->xmlChildrenNode; 

    while (cur != NULL) { 
     if (xmlStrcmp(cur->name, (const xmlChar *) "price") == 0) { 
     xmlNodePtr node = cur->xmlChildrenNode; 

     if (*kopf == NULL) { 
      *kopf = (Pricing *)HeapMalloc(sizeof(Pricing), "Pricing", 0); 
      ret = *kopf; 
     } else { 
      ret->next = (Pricing *)HeapMalloc(sizeof(Pricing), "Pricing", 0); 
      ret = ret->next; 
     } 

     parseAttribut(cur,  "age_group",  &(ret->age_group), fehler); 
     parseElement(doc, node, "EUR",    &(ret->price),  fehler); 
     } 
     cur = cur->next; 
    } 
    break; 
    } 
    cur = cur->next; 
} 
} 


void parseAttribut(xmlNodePtr node, const xmlChar *str, xmlChar **dest, short muss, short *fehler) 
{ 
    *dest = xmlGetProp(node, str); 
    return; 
} 

void parseElement(xmlDocPtr doc, xmlNodePtr node, const xmlChar *str, xmlChar **dest, short muss, short *fehler) 
{ 
    short found = FALSE; 

    while (node) { 
    if (xmlStrcmp(node->name, str) == 0) { 
     *dest = xmlNodeListGetString(doc, node->xmlChildrenNode, 1); 
     found = TRUE; 
     break; 
    } 
    node = node->next; 
    } 
    return; 
}