libxml2遍历问题!!!

hyf140 2008-07-01 12:42:46
请问用libxml编写程序进行遍历xml文件的每个节点,并且取得每个节点的值怎么弄?
libxml中有没有现成的函数调用?如果没有请各位高手指点指点递归算法怎么遍历xml文件,小弟先谢了!
...全文
791 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwhjy2007 2008-10-31
  • 打赏
  • 举报
回复
TAG_RTN_INFO *CMsgXml::ParseXml(char *docname,char *element_name,char *prop_name)
{
/*
TAG_RTN_INFO return_value;
TAG_RTN_INFO rtn_err;*/

// TAG_RTN_INFO return_value;
TAG_RTN_INFO *rtn_err=NULL;
TAG_RTN_INFO *P=NULL; //临时指针
TAG_RTN_INFO *head=NULL; //头指针
TAG_RTN_INFO *new_node=NULL; //新结点的指针
xmlDocPtr doc=NULL; //定义解析文档指针
xmlNodePtr curNode=NULL; //定义结点指针(你需要它为了在各个结点间移动)
xmlChar *szKey=NULL; //临时字符串变量
int maxlength=0;
//memset(&return_value,0x00,sizeof(return_value));
// return_value.next=NULL;


//出错时返回值
rtn_err=new TAG_RTN_INFO;
memset(rtn_err,0x00,sizeof(TAG_RTN_INFO));
memcpy(rtn_err->szelement_value,"ERROR",sizeof("ERROR"));
memcpy(rtn_err->szprop_value,"ERROR",sizeof("ERROR"));
rtn_err->next=NULL;

head=new TAG_RTN_INFO;
memset(head,0x00,sizeof(TAG_RTN_INFO));
head->next=NULL;


//doc = xmlReadFile(docname,"UTF-8",XML_PARSE_RECOVER); //解析文件
//doc=xmlParseFile(docname);
doc = xmlReadFile(docname,"UTF-8",256); //解析文件
//检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。
//一个常见错误是不适当的编码。XML标准文档除了用UTF-8或UTF-16外还可用其它编码保存。
if (NULL == doc)
{
//文档打开错误
head->next=rtn_err;
return head;
}

//printf("xmlReadFile success\n");

curNode = xmlDocGetRootElement(doc); //确定文档根元素

/*检查确认当前文档中包含内容*/
if (NULL == curNode)
{
//空得xml文件
printf("the file is empty\n");
xmlFreeDoc(doc);//释放空间
head->next=rtn_err;
return head;
}

curNode = curNode->xmlChildrenNode;

xmlNodePtr propNodePtr = curNode;

while(curNode != NULL)
{
//取出节点中的内容

//printf("name is %s\n",curNode->name);
if (!xmlStrcmp(curNode->name, BAD_CAST element_name))
{

new_node=new TAG_RTN_INFO;
P=head;
while(P->next!=NULL)
P=P->next;
P->next=new_node;
P=new_node;
szKey = xmlNodeGetContent(curNode);

//printf("name is %s value is %s\n",curNode->name,szKey);
//printf("the length is %d\n",strlen((char *)szKey));
maxlength=((strlen((char *)szKey)>1024)?1024:strlen((char *)szKey));
memcpy(P->szelement_value,szKey,strlen((char *)szKey));
P->szelement_value[strlen((char *)szKey)]=0;
//printf("name is %s value is %s\n",curNode->name,P->szelement_value);
xmlFree(szKey);
}


//查找带有属性attribute的节点
// printf("name is %s\n",curNode->name);
//printf("property is %s\n",prop_name);
if (xmlHasProp(curNode,BAD_CAST prop_name)||strlen(prop_name)==0)
{
propNodePtr = curNode;

xmlAttrPtr attrPtr = propNodePtr->properties;
while (attrPtr != NULL)
{
printf("1\n");
if (!xmlStrcmp(attrPtr->name, BAD_CAST prop_name))
{
xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST prop_name);
//printf("get attr szAttr is %s\n",szAttr);
maxlength = ((strlen((char *)szAttr)>1024)?1024:strlen((char *)szAttr));
memcpy(P->szprop_value,szAttr,maxlength);
xmlFree(szAttr);
}
attrPtr = attrPtr->next;
}
P->next=NULL;
}
else
{
delete new_node;
}


curNode = curNode->next;
}
//查找属性
//xmlAttrPtr attrPtr = propNodePtr->properties;
// while (attrPtr != NULL)
// {
// if (!xmlStrcmp(attrPtr->name, BAD_CAST prop_name))
// {
// xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST prop_name);
// //printf("get attr szAttr is %s\n",szAttr);
// maxlength = ((strlen((char *)szAttr)>1024)?1024:strlen((char *)szAttr));
// memcpy(return_value.szprop_value,szAttr,maxlength);
// xmlFree(szAttr);
// }
// attrPtr = attrPtr->next;
// }

xmlFreeDoc(doc);
return head;
}

//释放链表的内存空间
void CMsgXml::FreeXmlLinklist(TAG_RTN_INFO *XmlHead)
{
TAG_RTN_INFO *tmp;
while(XmlHead)
{
tmp=XmlHead->next;
delete XmlHead;
XmlHead=tmp;
}
}
hujw0710 2008-07-03
  • 打赏
  • 举报
回复
doc = xmlParseFile(confname);

if (doc == NULL )
{
fprintf(stderr,"(*)hjw: document(%s) not parsed successfully. \n",confname);
return 0;
}

cur = xmlDocGetRootElement(doc);

if (cur == NULL)
{
fprintf(stderr,"(*)hjw: empty document\n");
xmlFreeDoc(doc);
return 0;
}

if (xmlStrcmp(cur->name, (const xmlChar *) "dtv"))
{
fprintf(stderr,"(*)hjw: document of the wrong type, root node != dtv");
xmlFreeDoc(doc);
return 0;
}

cur = cur->xmlChildrenNode;

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

while (cur != NULL)
{
if ((!xmlStrcmp(cur->name, (const xmlChar *)"autoscan")))
{
attribute=(xmlChar *)configset.autoscan;
xmlSetProp(cur,(xmlChar *)"attribute",attribute);
DTVTRACE("set autoscan=%s\n",attribute);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"localscan")))
{
attribute=(xmlChar *)configset.localscan;
xmlSetProp(cur,(xmlChar *)"attribute",attribute);
DTVTRACE("set localscan=%s\n",attribute);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"minfrequency")))
{
key = (xmlChar *)configset.minfrequency;
xmlNodeSetContent(cur,key);
DTVTRACE("set minfrequency=%s\n",key);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"maxfrequency")))
{
key = (xmlChar *)configset.maxfrequency;
xmlNodeSetContent(cur,key);
DTVTRACE("set maxfrequency=%s\n",key);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"district")))
{
key = (xmlChar *)configset.district;
xmlNodeSetContent(cur,key);
DTVTRACE("set district=%s\n",key);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"allscan")))
{
attribute=(xmlChar *)configset.allscan;
xmlSetProp(cur,(xmlChar *)"attribute",attribute);
DTVTRACE("set allscan=%s\n",attribute);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"manualscan")))
{
attribute=(xmlChar *)configset.manualscan;
xmlSetProp(cur,(xmlChar *)"attribute",attribute);
DTVTRACE("set manualscan=%s\n",attribute);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"frequency")))
{
key = (xmlChar *)configset.frequency;
xmlNodeSetContent(cur,key);
DTVTRACE("set frequency=%s\n",key);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"modulate")))
{
key = (xmlChar *)configset.modulate;
xmlNodeSetContent(cur,key);
DTVTRACE("set modulate=%s\n",key);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"forwardcorrect")))
{
key = (xmlChar *)configset.forwardcorrect;
xmlNodeSetContent(cur,key);
DTVTRACE("set forwardcorrect=%s\n",key);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"protectinterval")))
{
key = (xmlChar *)configset.protectinterval;
xmlNodeSetContent(cur,key);
DTVTRACE("set protectinterval=%s\n",key);
}

if ((!xmlStrcmp(cur->name, (const xmlChar *)"timecomplect")))
{
key = (xmlChar *)configset.timecomplect;
xmlNodeSetContent(cur,key);
DTVTRACE("set timecomplect=%s\n",key);
}

cur = cur->next;
}

if(xmlSaveFile((const char *)confname,doc)<0)
{
printf("(*)hjw: save XML file failed\n");
}

xmlFreeDoc(doc);
return 1;
}
cur = cur->next;
}

xmlFreeDoc(doc);
return 1;
hyf140 2008-07-03
  • 打赏
  • 举报
回复
谢谢楼上的兄弟,呵呵
yuxian112 2008-07-02
  • 打赏
  • 举报
回复
我就有个libxml-2.6.31.chm,网上也可以下
hyf140 2008-07-01
  • 打赏
  • 举报
回复
再请问兄弟一下,那些API函数的各个参数的意义和功能在什么地方看?有没有什么文档说明?
还是只有官方网站的FAQ?
szkarry 2008-07-01
  • 打赏
  • 举报
回复
用xpath 或自己写循环遍历

23,215

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧