设为首页 加入收藏

TOP

C++使用libxml解析XML文件(一)
2014-02-08 13:36:28 来源: 作者: 【 】 浏览:181
Tags:使用 libxml 解析 XML 文件

  OpenCV中使用FileStorage创建和解析XML文件。但FileStorage不能处理节点为空的情况,且对属性也不友好。例子见这里。

  libxml是C接口的处理xml文件的开源代码库。可以在这里下载

  对于一段如下的xml文件:

  < xml version="1.0" >

  <Message Version="1.0">

  <Info evaluateType="2" mediaFile="1.avi">1</Info>

  <Items>

  <Item frameNum="0" scale="2" />

  <Item frameNum="1" scale="2" />

  <Item frameNum="2" scale="2" />

  <Item frameNum="2913" scale="2">

  <Label type="2" l="564" t="178" r="594" b="280" id="15" />

  <Label type="2" l="528" t="184" r="560" b="288" id="11" />

  <Label type="2" l="490" t="182" r="522" b="288" id="16" />

  <Label type="2" l="614" t="358" r="704" b="600" id="4" />

  </Item>

  </Items>

  </Message>

  libxml处理的函数如下:

  string getLabes(char *szDocName, map<pair<int,int>,Rect > &labels){

  xmlDocPtr doc;

  xmlNodePtr curNode;

  xmlChar *szKey;

  string filename="";

  doc = xmlReadFile(szDocName,"GB2312",XML_PARSE_RECOVER); //解析文件

  if (doc==NULL){

  fprintf(stderr,"Document not parsed successfully.\n");

  return filename;

  }

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

  if (NULL == curNode){

  fprintf(stderr,"empty document\n");

  xmlFreeDoc(doc);

  return filename;

  }

  if (xmlStrcmp(curNode->name, BAD_CAST "Message")) {

  fprintf(stderr,"document of the wrong type, root node != Message");

  xmlFreeDoc(doc);

  return filename;

  }

  curNode = curNode->xmlChildrenNode;

  xmlNodePtr propNodePtr = curNode;

  xmlNodePtr itemNodePtr;

  while(curNode != NULL){

  //取出文件名称

  if (xmlHasProp(curNode,BAD_CAST "mediaFile")) {

  propNodePtr = curNode;

  }

  if (!xmlStrcmp(curNode->name, BAD_CAST "Items")) {

  itemNodePtr = curNode->xmlChildrenNode;

  }

  curNode = curNode->next;

  }

  xmlAttrPtr attrPtr = propNodePtr->properties;

  while (attrPtr != NULL){

  if (!xmlStrcmp(attrPtr->name, BAD_CAST "mediaFile")){

  xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "mediaFile");

  char* szAttrG = u2g((char*)szAttr);

  filename = string(szAttrG);

  //cout《"get filename: "《filename《endl;

  xmlFree(szAttr);

  }

  attrPtr = attrPtr->next;

  }

  // Item

  while (itemNodePtr != NULL){

  int frameNum = 0;

  int peopleID = 0;

  Rect rect;

  //<Label type="2" l="620" t="164" r="648" b="234" id="15" />

  xmlAttrPtr attrPtr = itemNodePtr->properties;

  while (attrPtr != NULL){

  if (!xmlStrcmp(attrPtr->name, BAD_CAST "frameNum")){

  xmlChar* szAttr = xmlGetProp(itemNodePtr,BAD_CAST "frameNum");

  frameNum = atoi((char*)szAttr);

  //cout《"get frameNum: "《frameNum《endl;

  xmlFree(szAttr);

  }

   

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++实现在线翻译之发声篇 下一篇code block与VC++下相对路径..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)