发现xml存储,查看方便。所以想用用它,但是解析它不太容易。我用C++自带的string类 勉强实现了这一功能。
我生成了这样一串xml:(carinfo.xml)
<carnode><id>0</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>1</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>2</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>3</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>4</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<car></car>里面代表了一辆车,里面是它的元素。
大致思路是这样: 先把这一文件转换为string类型,string 类型里有find() ,rfind(),erase() 方法,从尾到头的
解析,解析一个节点,马上删除一个节点,这样每次循环只要处理最后一个节点,简化处理。
int main()
{
//定义元素分隔符
const char node_starter[15] = "<carnode>";
const char node_ender[15] = "</carnode>";
const char id_starter[15] = "<id>";
const char id_ender[15] = "</id>";
const char time_starter[15] = "<time>";
const char time_ender[15] = "</time>";
const char event_starter[15] = "<event>";
const char event_ender[15] = "</event>";
//解析xml文件,要能给出节点的个数 ,需要字符串匹配
//一次解析一个节点,然后文件指针指向下一个节点,直到没有了节点
//对于每个节点里面,
FILE* inputxml = fopen( "carinfo.xml" , "rb" ); //打开一个只读asic文件
//利用强大的STL
vector<char> c_vector;
//从文件读入字符到向量
while( !feof( inputxml ) )
{
char temp_char = fgetc( inputxml );
c_vector.push_back( temp_char );
}
fclose(inputxml);
char c_array[ c_vector.size() ];
int index = 0;
//从向量中取出字符到数组,并加上结束标志
for(vector<char>::iterator it = c_vector.begin();it != c_vector.end();it++)
{
c_array[ index ] = *it;
if(index == ( c_vector.size() - 1 ) )
{
c_array[ index ] = '\0';
}
index++;
}
string file_copy( c_array );
cout<<"test:: the file string is:\n"<<file_copy<<endl;
unsigned int node_count = 0;
//有了string类型,字符串匹配就方便了
//每次循环找最后一对<carnode></carnode>,找到就删除,再找下一对,这样就能得到节点的个数
//结束标志 :长度为0
while(file_copy.size()>1)
{
node_count++;
int last_carnode_starter_position = file_copy.rfind( node_starter );
//在这里就只需要慢慢的解析一个节点的元素了
string event_string;
parseElement( event_starter , event_ender , file_copy , event_string);
cout<< "the event:" << event_string << "<|>" ;
string time_string;
parseElement( time_starter , time_ender , file_copy , time_string);
cout<<"the time:"<<time_string<<"<|>";
string id_string;
parseElement( id_starter , id_ender , file_copy , id_string);
cout<<"the id:"<<id_string<<endl;
file_copy.erase( last_carnode_starter_position );
}
cout<<"the node number is: "<<node_count<<endl;
system( "PAUSE" );
return 1;
}
/*************
解析一个节点里的某个元素
parameter:
starter
ender
file_string
result
里面的数学关系搞对就行,所以就不多注释
*************/
bool parseElement(const char* starter,const char* ender,const string file_string,string& result)
{
short starter_position = file_string.rfind( starter );
short ender_position = file_string.rfind( ender );
short result_string_size = ender_position - ( starter_position + strlen( starter ) );
char result_storage[ result_string_size + 1];
for(short index = 0;index < result_string_size ;index++)
{
result_storage[ index ] = file_string[ starter_position + strlen( starter ) + index];
}
result_storage[ result_string_size ] = '\0';
result=string(result_storage);
}
string 能支持4G的长度,我想这样一般的需求还是能满足的,不必用第三方库了。
分享到:
相关推荐
3. **基于STL的轻量级解析器**:考虑到题目要求,我们可以使用自定义的轻量级XML解析器,利用C++的字符串操作和标准模板库(STL)来解析XML。例如,我们可以逐行读取XML文件,然后根据特定的XML语法(如起始标签 `和...
本主题将深入探讨如何使用纯C++语言来解析XML文件,仅依赖于标准模板库(STL),而不引入额外的第三方库。 首先,解析XML的基本步骤包括读取文件、识别元素结构、处理属性和内容,以及递归地遍历整个文档。在C++中...
在Visual C++(简称VC)环境下,为了处理XML文件,开发者通常会使用特定的库或者API来解析XML文档。本篇文章将详细介绍如何在VC中使用简易XML解析工具,以实现快速、便捷地读取和操作XML文件。 首先,理解XML的基本...
使用这个简易XML解析器,开发者可以轻松地在自己的项目中处理XML数据,无论是读取配置文件、解析XML数据交换还是生成XML报告。通过xCfgParser.h提供的接口,可以方便地集成到C++项目中,而无需依赖大型的XML解析库。...
标题中的“一个基于XML的Log框架.rar_STL_c+ log stl_c+ stl log_xml_文件 操作”表明这是一个关于使用C++编程语言,并结合STL(Standard Template Library,标准模板库)来创建一个日志框架,且该框架与XML文件操作...
本篇文章将详细介绍如何使用TinyXML解析XML文件,并将节点保存到STL容器`std::vector`中进行动态存储,以及如何处理内存管理和界面美化。 首先,我们需要了解TinyXML的基本用法。TinyXML库提供了几个主要的类,如`...
本教程将详细介绍如何在VC++中解析XML,主要涉及两种方法:使用微软官方提供的MSXML SDK和使用STL/CLR库。 首先,我们来谈谈MSXML SDK。微软的MSXML(Microsoft XML Core Services)是一个COM组件,它提供了多种...
在“Vc++ 解析Xml(用于Landsat元数据)”这个主题中,我们将深入探讨如何使用C++来解析大规模的XML文件,特别是针对Landsat卫星图像的元数据。Landsat是美国的一个长期地球观测计划,其卫星拍摄的图像数据通常附带...
7. **使用示例**:用户可以通过调用解析器的接口,如`parseFile()`解析XML文件,`getNodeValue()`获取节点值,`addChildNode()`添加子节点,`saveToFile()`保存XML到文件。 总之,C++实现XML解析器涉及文件I/O、...
总之,C++解析XML的方法主要涉及XML的基础知识、Tinyxml库的使用以及如何结合STL容器来处理XML数据。Tinyxml虽然不支持XML验证,但因其简单易用,对于处理配置文件等简单XML文档,是一个非常实用的选择。开发者可以...
本篇将重点讲解如何使用C++来解析XML文件,主要涉及一个名为"CMarkup"的库。 "CMarkup"是一个轻量级的C++库,专门设计用于处理XML文档。它提供了简洁的API,使得在C++程序中解析、操作和生成XML变得相对简单。在...
综上所述,"xml c++解析类"提供了C++环境中解析XML的工具,结合STL的优势,使得在C++程序中处理XML数据变得简单和高效。通过`MarkupSTL`和`XmlDoc`这两个类,开发者可以方便地读取、操作和创建XML文档,从而实现更...
【分享一下】 里面内容很多。。 觉得好就下吧 Cmarkup是依据EDOM的,这是这个简单XML分析的关键。EDOM是操作XML元素、属性和数据的简明方法集。...STL:CMarkupSTL类完全没有使用MFC,它的演示要使用STL编译选项。
3. **解析XML文档**:使用`TiXmlDocument::LoadFile()`或`TiXmlDocument::Parse()`方法加载XML文件或字符串。例如: ```cpp TiXmlDocument doc("example.xml"); if (!doc.LoadFile()) { cerr () ; return 1; }...
TinyXML 是一个专门为 C++ 开发的轻量级 XML 解析器,它的设计目标是简单易用,并且能够轻松地整合到其他项目中。TinyXML 实现了一个文档对象模型(DOM),通过解析 XML 文档,生成一个可以直接读取、修改和保存的...
只需包含`MarkupSTL.h`头文件,然后调用提供的API,即可开始解析XML文档。例如,创建一个解析器对象,加载XML文件,遍历元素并访问其属性和内容,这些都是常见的操作。 然而,尽管MarkupSTL在轻量化和速度上表现...
XML(eXtensible Markup Language)是一种标记语言,广泛用于数据交换和配置文件,因为它具有结构化、易于解析和人类可读的特点。将MFC对象序列化为XML格式,可以方便地存储和加载复杂的数据结构,同时保持跨平台...
C++中实现XML解析通常有几种方法:DOM(Document Object Model)、SAX(Simple API for XML)和STL流式解析。DOM解析会将整个XML文档加载到内存中形成一棵树状结构,方便遍历和操作;SAX是事件驱动的解析方式,只在...
正确解析XML需要理解这些基本元素及其关系。 - **DTD(Document Type Definition)**:定义XML文档结构的规范,可用来验证文档是否符合规定格式。 - **XML Schema**:更现代的验证方式,提供了比DTD更强大的数据...
TinyXml 是一款轻量级的 XML 解析器,主要用于处理小型数据、配置文件和对象序列化等场景。它采用 DOM(Document Object Model)模型来解析 XML 文档,使得开发者能够方便地读取、修改和创建 XML 结构。TinyXml 的...