`
westice
  • 浏览: 115558 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

stl解析xml

阅读更多

发现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的长度,我想这样一般的需求还是能满足的,不必用第三方库了。

 

分享到:
评论

相关推荐

    解析XML的VC程序

    3. **基于STL的轻量级解析器**:考虑到题目要求,我们可以使用自定义的轻量级XML解析器,利用C++的字符串操作和标准模板库(STL)来解析XML。例如,我们可以逐行读取XML文件,然后根据特定的XML语法(如起始标签 `和...

    纯C++解析XML

    本主题将深入探讨如何使用纯C++语言来解析XML文件,仅依赖于标准模板库(STL),而不引入额外的第三方库。 首先,解析XML的基本步骤包括读取文件、识别元素结构、处理属性和内容,以及递归地遍历整个文档。在C++中...

    xml 文件解析,可以在vc中直接使用的简易xml解析工具,方便简单快截

    在Visual C++(简称VC)环境下,为了处理XML文件,开发者通常会使用特定的库或者API来解析XML文档。本篇文章将详细介绍如何在VC中使用简易XML解析工具,以实现快速、便捷地读取和操作XML文件。 首先,理解XML的基本...

    简易XML解析器

    使用这个简易XML解析器,开发者可以轻松地在自己的项目中处理XML数据,无论是读取配置文件、解析XML数据交换还是生成XML报告。通过xCfgParser.h提供的接口,可以方便地集成到C++项目中,而无需依赖大型的XML解析库。...

    一个基于XML的Log框架.rar_STL_c+ log stl_c+ stl log_xml_文件 操作

    标题中的“一个基于XML的Log框架.rar_STL_c+ log stl_c+ stl log_xml_文件 操作”表明这是一个关于使用C++编程语言,并结合STL(Standard Template Library,标准模板库)来创建一个日志框架,且该框架与XML文件操作...

    tinyxml解析xml

    本篇文章将详细介绍如何使用TinyXML解析XML文件,并将节点保存到STL容器`std::vector`中进行动态存储,以及如何处理内存管理和界面美化。 首先,我们需要了解TinyXML的基本用法。TinyXML库提供了几个主要的类,如`...

    VC++解析XML(内含微软官方SDK)

    本教程将详细介绍如何在VC++中解析XML,主要涉及两种方法:使用微软官方提供的MSXML SDK和使用STL/CLR库。 首先,我们来谈谈MSXML SDK。微软的MSXML(Microsoft XML Core Services)是一个COM组件,它提供了多种...

    Vc++ 解析Xml(用于Landsat元数据)

    在“Vc++ 解析Xml(用于Landsat元数据)”这个主题中,我们将深入探讨如何使用C++来解析大规模的XML文件,特别是针对Landsat卫星图像的元数据。Landsat是美国的一个长期地球观测计划,其卫星拍摄的图像数据通常附带...

    XML解析器c++实现代码

    7. **使用示例**:用户可以通过调用解析器的接口,如`parseFile()`解析XML文件,`getNodeValue()`获取节点值,`addChildNode()`添加子节点,`saveToFile()`保存XML到文件。 总之,C++实现XML解析器涉及文件I/O、...

    C++解析XML方法的研究和实现.docx

    总之,C++解析XML的方法主要涉及XML的基础知识、Tinyxml库的使用以及如何结合STL容器来处理XML数据。Tinyxml虽然不支持XML验证,但因其简单易用,对于处理配置文件等简单XML文档,是一个非常实用的选择。开发者可以...

    解析XML的C++原代码

    本篇将重点讲解如何使用C++来解析XML文件,主要涉及一个名为"CMarkup"的库。 "CMarkup"是一个轻量级的C++库,专门设计用于处理XML文档。它提供了简洁的API,使得在C++程序中解析、操作和生成XML变得相对简单。在...

    xml c++解析类

    综上所述,"xml c++解析类"提供了C++环境中解析XML的工具,结合STL的优势,使得在C++程序中处理XML数据变得简单和高效。通过`MarkupSTL`和`XmlDoc`这两个类,开发者可以方便地读取、操作和创建XML文档,从而实现更...

    VC使用Cmarkup生成、解析xml资料

    【分享一下】 里面内容很多。。 觉得好就下吧 Cmarkup是依据EDOM的,这是这个简单XML分析的关键。EDOM是操作XML元素、属性和数据的简明方法集。...STL:CMarkupSTL类完全没有使用MFC,它的演示要使用STL编译选项。

    tinyxml_2_5_2.zip_XML解析_tinyxml

    3. **解析XML文档**:使用`TiXmlDocument::LoadFile()`或`TiXmlDocument::Parse()`方法加载XML文件或字符串。例如: ```cpp TiXmlDocument doc("example.xml"); if (!doc.LoadFile()) { cerr () ; return 1; }...

    tinyXML C++ 解析器

    TinyXML 是一个专门为 C++ 开发的轻量级 XML 解析器,它的设计目标是简单易用,并且能够轻松地整合到其他项目中。TinyXML 实现了一个文档对象模型(DOM),通过解析 XML 文档,生成一个可以直接读取、修改和保存的...

    MarkupSTL最小的XML解析器

    只需包含`MarkupSTL.h`头文件,然后调用提供的API,即可开始解析XML文档。例如,创建一个解析器对象,加载XML文件,遍历元素并访问其属性和内容,这些都是常见的操作。 然而,尽管MarkupSTL在轻量化和速度上表现...

    MFC序列化到xml文档,支持STL的vector,map,pair

    XML(eXtensible Markup Language)是一种标记语言,广泛用于数据交换和配置文件,因为它具有结构化、易于解析和人类可读的特点。将MFC对象序列化为XML格式,可以方便地存储和加载复杂的数据结构,同时保持跨平台...

    xml文档解析器--c++源代码

    C++中实现XML解析通常有几种方法:DOM(Document Object Model)、SAX(Simple API for XML)和STL流式解析。DOM解析会将整个XML文档加载到内存中形成一棵树状结构,方便遍历和操作;SAX是事件驱动的解析方式,只在...

    c,c++高手实现xml文件读写解析底层

    正确解析XML需要理解这些基本元素及其关系。 - **DTD(Document Type Definition)**:定义XML文档结构的规范,可用来验证文档是否符合规定格式。 - **XML Schema**:更现代的验证方式,提供了比DTD更强大的数据...

    xml解析器TinyXml使用

    TinyXml 是一款轻量级的 XML 解析器,主要用于处理小型数据、配置文件和对象序列化等场景。它采用 DOM(Document Object Model)模型来解析 XML 文档,使得开发者能够方便地读取、修改和创建 XML 结构。TinyXml 的...

Global site tag (gtag.js) - Google Analytics