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);
}
attrPtr = attrPtr->next;
}
// Label
xmlNodePtr childNodePtr = itemNodePtr->xmlChildrenNode;
while (childNodePtr != NULL){
int l=0,t=0,r=0,b=0;
attrPtr = childNodePtr->properties;
while(attrPtr != NULL){
if (!xmlStrcmp(attrPtr->name, BAD_CAST "l")){
xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "l");
l=atoi((char*)szAttr);
xmlFree(szAttr);
}
if (!xmlStrcmp(attrPtr->name, BAD_CAST "t")){
xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "t");
t=atoi((char*)szAttr);
xmlFree(szAttr);
}
if (!xmlStrcmp(attrPtr->name, BAD_CAST "r")){
xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "r");
r=atoi((char*)szAttr);
xmlFree(szAttr);
}
if (!xmlStrcmp(attrPtr->name, BAD_CAST "b")){
xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "b");
b=atoi((char*)szAttr);
xmlFree(szAttr);
}
if (!xmlStrcmp(attrPtr->name, BAD_CAST "id")){
xmlChar* szAttr = xmlGetProp(childNodePtr,BAD_CAST "id");
peopleID=atoi((char*)szAttr);
xmlFree(szAttr);
}
attrPtr = attrPtr->next;
}
if(!(l==0&&t==0&&b==0&&r==0)){
rect.x=l;rect.y=t;rect.width=r-l;rect.height=b-t;
labels[pair<int,int>(frameNum,peopleID)] = rect;
//cout<<"get label: "<<l<<" "<<t<<" "<<r<<" "<<b<<" "<<" "<<peopleID<<endl;
}
childNodePtr = childNodePtr->next;
}
itemNodePtr = itemNodePtr->next;
}
xmlFreeDoc(doc);
return filename;
}
用map的iterator输出:
for(map<pair<int,int>,Rect >::iterator it=labels.begin();
it!=labels.end();it++){
cout<<(*it).first.first<<" "<<(*it).first.second<<" "
<<(*it).second.x<<" "<<(*it).second.y<<" "
<<(*it).second.width<<" "<<(*it).second.height<<endl;
}
分享到:
相关推荐
c++_libxml解析xml 例题分析
Ubuntu下C语言使用libxml2库创建、解析xml文件,包括对节点的增、删、改、查等
libxml解析xml c++开发中解析 所用到的库 以及使用说明 等 这是自己做项目中遇到的问题 然后通过用这个包中的两个库 以及 按照自己总结的方法 实现的
目前,对xml的使用非常广泛,读取和设置xml配置文件是我们最常用的操作。常见C/C++ XML解析器有Tinyxml、XERCES、...这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
利用libxml2实现的写入和解析XML的c++类,文件中包含了测试的Demo。
主要给大家介绍了关于C/C++利用libxml2高效输出XML大文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
Libxml2是为Gnome项目开发的XML C解析器和工具包(但可以在Gnome平台之外使用),它是MIT License下的免费软件。
组装xml并使用socket发送到服务端,由服务端解析并显示
TinyXml: 一个小型XML解析程序,简单易用。
libxml是一个用来解析XML文档的函数库。它用C语言写成, 并且能为多种语言所调用,例如C语言,C++,XSH。C#, Python,Kylix/Delphi,Ruby,和PHP等。Perl中也可以使用XML::LibXML模块。它最初是为GNOME开发的项目,但...
在Linux 平台下使用libxml2对XML解析,C++源码
Libxml2 是一个xml c语言版的解析器,本来是为Gnome项目开发的工具,是一个基于MIT License的免费开源软件。它除了支持c语言版以外,还支持c++、PHP、Pascal、Ruby、Tcl等语言的绑定,能在Windows、Linux、Solaris、...
iconv-1.9.2.win32,libxml2-2.6.30.win32,zlib-1.2.3.win32, VS2010 C++ 解析XML文件库
libxml2是一个用来解析XML文档的函数库。它用 C 语言写成,并且能被多种语言所调用,如 C、C++、XSH、C#、Python、Kylix、Delphi、Ruby、PHP 等。 注:先解压得到libxml2-2.9.1.tar.gz文件,然后再拷贝到linux系统...
对开源的libxml2进行了封装扩展,使功能更加完善,可用于c c++ 编译中配置文件解析或校验
libxml2是一个用来解析XML文档的函数库。它用 C 语言写成,并且能被多种语言所调用,如 C、C++、XSH、C#、Python、Kylix、Delphi、Ruby、PHP 等。它最初是为 GNOME 开发的项目,但是现在可以用在各种各样的项目中。...
linux平台简单的xml解析这里边都有示例代码; 下载后先看readMe; 你懂得
Summary: xml4wrapper 3.6.2, 支持libxml2-2.7.8 或 xercesc2.8或tinyxml2或rapidxml封装的xml配置文件解析和操作统一C++接口, 支持XPATH的方式访问和操作XML节点信息. 操作非常相当之方便, 相应库的更高版本也行...