最近做一个android工厂测试,里面需要一个解析xml文件,以前用java c#解析过xml,这次用c解析xml首先是第一次,下面是上代码先
首先引用头文件:
#include <libxml/parser.h>
//doc是xml路径
//rootNode是叶子节点
//cameraName是xml中的Profiles的name
//cv和ch指针是返回保存的地址
int flag_cv=0;
int flag_ch=0;
void getCameraValue(xmlDocPtr doc,xmlNode *rootNode , char* cameraName, xmlChar *cv,xmlChar *ch){
xmlNode *curNode;
xmlChar *v;
for(curNode=rootNode; curNode!=NULL; curNode=curNode->next)
{
if(curNode->type==XML_ELEMENT_NODE)
{
//printf("node name:%s \n",curNode->name);
xmlAttr *attr=curNode->properties;//首个节点或NULL
while(attr!=NULL)
{
v=xmlGetProp(curNode,attr->name);//获取属性内容
//printf("\tattr(%s)=%s \n",attr->name,v);
if(flag_cv && !strcmp("flipping",curNode->name) && !strcmp("value_v",attr->name) )
{
flag_cv=0;
//printf("\tattr(%s)=%s \n",attr->name,v);
strncpy(cv, v, strlen(v) + 1);
}
if(flag_ch && !strcmp("flipping",curNode->name) && !strcmp("value",attr->name) )
{
flag_ch=0;
//printf("\tattr(%s)=%s \n",attr->name,v);
strncpy(ch, v, strlen(v) + 1);
}
if(!strcmp(cameraName,v))
{
flag_cv=1;
flag_ch=1;
}
xmlFree(v);
attr=attr->next;
}
}
getCameraValue(doc,curNode->children,cameraName,cv,ch);
}
}
xml代码
<CameraSettings>
<Profiles cameraId="0" name="123">
<flipping value="H" value_v="V"/>
</Profiles>
<Profiles cameraId="0" name="456">
<flipping value="H" value_v="V"/>
</Profiles>
</CameraSettings>
最后ch读出的是H,cv都出来是V