【问题标题】:Get attribute value by path with libxml2?使用 libxml2 通过路径获取属性值?
【发布时间】:2017-07-20 09:41:36
【问题描述】:

假设我有以下 xml:

 <CATALOG>
    <CD name="CD1">
        <music name="MYPLAYLIST1">
            <style styleName="rock" quantity="120"></style>
            <style styleName="pop" quantity="20"></style>
        </music>
    </CD>
    <CD name="CD2">
        <music name="MYPLAYLIST1">
            <style styleName="rock" quantity="80"></style>
            <style styleName="pop" quantity="80"></style>
        </music>
        <music name="MYPLAYLIST2">
            <style styleName="reggae" ></style>
            <style styleName="rap"></style>
        </music>
    </CD>
</CATALOG>

我想为我的函数提供以下参数:“CD2.MYPLAYLIST1.pop” 作为答案,我想得到以下信息:“quantity=80” 我怎样才能赚到这个?我想在以下函数中实现:

void fv_v_getAttr(xmlNode *ptr_Node_Parent,char* ptr_src){
...
}

ptr_node_Parent 是我的根目录 (CATALOG),ptr_src 是我的字符串 ("CD2.MYPLAYLIST1.pop")

我唯一能做的就是:

void fv_v_getAttr(xmlNode *ptr_Node_Parent,char* ptr_src){
    char *ptr_help = strdup(ptr_src);
    ptr_src=strtok(ptr_help,".");

    printf("\CD name:%s\n",ptr_src);
    ptr_src=strtok(NULL,".");
    printf("music name:%s\n", ptr_src);
    ptr_src=strtok(NULL,".");
    printf("stylename:%s\n", ptr_src);;

}

我需要检查整棵树还是有任何 libxml2 函数可以解决这个问题? 先感谢您, 伴侣

【问题讨论】:

    标签: c xml libxml2


    【解决方案1】:

    重新考虑问题后,我可以用以下代码解决:

    void fv_v_getAttr(xmlNode *ptr_Node_Parent,char* ptr_src){
    char *ptr_help = strdup(ptr_src);
    xmlNode *ptr_Node_Child = ptr_Node_Parent->children;     
    ptr_src=strtok(ptr_help,".");                          
    
    while(ptr_Node_Child){
        xmlAttr *ptr_Attr = ptr_Node_Child->properties;
        if( (ptr_Node_Child->type == XML_ELEMENT_NODE) && (strcmp(xmlGetProp(ptr_Node_Child,ptr_Attr->name),ptr_src) == NULL )){ 
            ptr_Node_Child = ptr_Node_Child->children;         
            ptr_src=strtok(NULL,".");                          
            while(ptr_Node_Child){
                ptr_Attr = ptr_Node_Child->properties;
                if((ptr_Node_Child->type == XML_ELEMENT_NODE) && (strcmp(xmlGetProp(ptr_Node_Child,ptr_Attr->name),ptr_src) == NULL )){ 
                    ptr_Node_Child= ptr_Node_Child->children;  
                    ptr_src=strtok(NULL,".");    
                    while(ptr_Node_Child){
                        ptr_Attr = ptr_Node_Child->properties;
                        xmlAttr *attr_name = ptr_Node_Child->properties;     
                        if((ptr_Node_Child->type == XML_ELEMENT_NODE) && (strcmp(xmlGetProp(ptr_Node_Child,ptr_Attr->name),ptr_src) == NULL )) {
                            attr_name=attr_name->next;                                                        
                            printf("\n%s=%s\n", attr_name->name, xmlGetProp(ptr_Node_Child,attr_name->name)); 
                            ptr_Node_Child = ptr_Node_Child->next;
                        } 
                        else{
                           ptr_Node_Child = ptr_Node_Child->next;
                        }
                    }//endWhile
                } 
                else{
                    ptr_Node_Child=ptr_Node_Child->next;
                }
            }//endWhile
        }
        else{
            ptr_Node_Child = ptr_Node_Child->next;
        }
    }//endWhile  
    

    }

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 2017-07-31
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      相关资源
      最近更新 更多