基于Tingxml的XML数据解析方法研究

合集下载

tinyxml用法

tinyxml用法

tinyxml用法TinyXML是一个用于解析和生成XML文件的C++库。

它提供了一组简单且易于使用的API,可将XML文档解析为树状结构,让用户可以通过遍历这棵树来获取和修改XML文件中的内容。

本文将详细介绍TinyXML的使用方法,包括如何解析XML文件、访问节点、修改节点内容以及生成XML 文件等。

一、解析XML文件1.引入头文件和命名空间要使用TinyXML,首先需要引入头文件tinyxml.h:#include <tinyxml.h>然后在代码中使用命名空间:using namespace std;using namespace tinyxml2;2.打开并解析XML文件创建一个XML文档对象以及一个错误代码对象,然后调用LoadFile(方法打开并解析XML文件:XMLDocument doc;doc.LoadFile("example.xml");3.获取根节点使用RootElement(方法获取根节点:XMLElement* root = doc.RootElement(;4.遍历子节点可以使用FirstChildElement(方法获取第一个子节点,然后使用NextSiblingElement(方法依次获取下一个兄弟节点,直到遍历完所有子节点:for (XMLElement* child = root->FirstChildElement(; child != NULL; child = child->NextSiblingElement()//对子节点进行操作5.获取节点属性和内容使用Attribute(方法获取节点的属性值,使用GetText(方法获取节点的文本内容:const char* attributeValue = node->Attribute("属性名");const char* textContent = node->GetText(;二、访问和修改节点1.创建新节点可以使用NewElement(方法创建一个新节点,然后将其添加到指定节点的子节点列表中:XMLElement* newNode = doc.NewElement("节点名称");parentNode->InsertEndChild(newNode);2.修改节点属性和内容使用SetAttribute(方法设置节点的属性值,使用SetText(方法设置节点的文本内容:node->SetAttribute("属性名", "属性值");node->SetText("文本内容");3.删除节点使用DeleteChildren(方法删除节点的所有子节点:node->DeleteChildren(;4.复制节点可以使用CloneNode(方法复制一个节点:XMLElement* newNode = node->CloneNode(true);三、生成XML文件1.创建一个XML文档对象XMLDocument doc;2.创建根节点使用NewElement(方法创建一个根节点并将其添加到文档中:XMLElement* root = doc.NewElement("根节点名称");doc.InsertEndChild(root);3.创建子节点使用NewElement(方法创建一个子节点并将其添加到根节点的子节点列表中:XMLElement* child = doc.NewElement("子节点名称");root->InsertEndChild(child);4.创建属性使用SetAttribute(方法设置节点的属性值:child->SetAttribute("属性名", "属性值");5.创建文本内容使用SetText(方法设置节点的文本内容:child->SetText("文本内容");6.保存XML文件使用SaveFile(方法将XML文档保存为文件:doc.SaveFile("example.xml");以上就是TinyXML库的基本用法。

使用tingxml解析XML

使用tingxml解析XML

使用tinyxml解析XML一、下载tinyxml库:略二、VS编译:略三、将tinyxml中的下列文件加到工程目录下:tinyxml.cpp,tinyxml.h,tinyxmlerror.cpp,tinyxmlparser.cpp,tinystr.cpp,tinystr.h将两个.h引入到工程,用到时包含tinyxml.h四、将Debugtinyxml中的tinyxml.lib加到工程目录下:按以上加到工程属性里去。

*注*:std.xml是工程目录下的文件:<Class name="计算机软件班"><Students><student name="张三" studentNo="13031001" sex="男" age="22"> <phone>88208888</phone><address>西安市太白南路二号</address></student><student name="李四" studentNo="13031002" sex="男" age="20"> <phone>88206666</phone><address>西安市光华路</address></student><student name="王五" studentNo="13031003" sex="男" age="23"> <phone>8820777</phone><address>西安市光华2路</address></student></Students></Class>测试代码:TiXmlDocument* myDocument = new TiXmlDocument();//创洹?建¨了?一?个?对?象ómyDocument->LoadFile("std.xml");//读á取?本?目?录?下?文?件tTiXmlElement* rootElement = myDocument->RootElement(); //ClassTiXmlElement* studentsElement = rootElement->FirstChildElement(); //所ù有瓺的?StudentsTiXmlElement* studentElement = studentsElement->FirstChildElement(); //第台?一?个?Studentwhile ( studentElement ){TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute(); //获?得?student的?属?性?while ( attributeOfStudent ){std::cout<< attributeOfStudent->Name() << " : "<< attributeOfStudent->Value() << std::endl;attributeOfStudent = attributeOfStudent->Next();}TiXmlElement* phoneElement= studentElement->FirstChildElement();//获?得?student 的?phone元a素?std::cout << "phone" << " : " << phoneElement->GetText() << std::endl;TiXmlElement* addressElement = phoneElement->NextSiblingElement();//下?一?个?addressstd::cout << "address" << " : " << phoneElement->GetText() << std::endl;studentElement = studentElement->NextSiblingElement();//下?一?个?student }。

TIXML使用详解

TIXML使用详解
if ( !pParent ) return;
TiXmlNode* pChild;
TiXmlText* pText; int t = pParent->Type(); printf( "type %d/n", t); int num;
switch ( t ) { case TiXmlNode::DOCUMENT:
<name>TinyXml How To</name> <price unit=”RMB”>20</price> <description>Some words…</description> </ book > 整个文档,对应 TiXmlDocument book,name,price, description,都对应 TiXmlElement 第一行对应一个 TiXmlDeclaration 第二行对应一个 TiXmlComment “TinyXml How To”对应一个 TiXmlText unit 则是 price 的一个 TiXmlAttribute 这些类与 XML 文件中的相应元素都有很好的对应关系,因此相信参照 TinyXml 的文档,可以 很容易的掌握各个方法的使用。 2. 需要注意的问题 各类之间的转换 由于各个节点类都从 TiXmlNode 继承,在使用时常常需要将 TiXmlNode*类型的指针转换为 其派生类的指针,在进行这种转换时,应该首先使用由 TiXmlNode 类提供的一系列转换函数, 如 ToElement(void),而不是 c++的 dynamic_cast。 检查返回值 由于 TinyXml 是一个非校验的解析器,因此当解析一个文件时,很可能文件并不包含我们预 期的某个节点,在这种情况下,TinyXml 将返回空指针。因此,必须要对返回值进行检查, 否则将很容易出现内存访问的错误。 如何重头建立一个 XML 文件 先建立一个 TiXmlDocument 对象,然后,载入某个模板,或者直接插入一个节点作为根节点, 接着就可以像打开一个已有的 XML 文件那样对它进行操作了。

TinyXml使用

TinyXml使用

这次使用了TinyXML后,觉得这个东西真是不错,于是将使用方法坐下总结来和大家分享。

该解析库在开源网站()上有下载,在本Blog也提供下载(下载TinyXML)TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux 中编译。

这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这课XML树。

注:DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系(理解html语言的读者会很容易理解这种树状模型)。

如下是一个XML片段:<Persons><Person ID="1"><name>周星星</name><age>20</age></Person><Person ID="2"><name>白晶晶</name><age>18</age></Person></Persons>在TinyXML中,根据XML的各种元素来定义了一些类:TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释。

TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分。

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

C++使用TinyXML解析XML

C++使用TinyXML解析XML

C++使⽤TinyXML解析XML⽬录1.介绍2.TinyXML配置3.TinyXML读取和保存⽂件3.1 读取xml⽂件3.2 读取xml参数3.3 保存xml参数到⽂本3.4 保存xml参数到临时变量4.TinyXML增删改查4.1 增4.2 删4.3 改4.4 查5.⼀个完整例⼦1.介绍在TinyXML中,根据XML的各种元素来定义了⼀些类:TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。

TiXmlDocument:对应于XML的整个⽂档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的⽂字部分TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的⼀些操作。

根据下图来说明常⽤的类对应的⽂本格式:<?xml version="1.0" ?> //TiXmlDeclaration,声明<MyApp> //TiXmlElement,元素<!-- Settings for MyApp -->//TiXmlComment,注释<Messages>//TiXmlElement,元素<Welcome>Welcome to MyApp</Welcome>//<Welcome>是元素TiXmlElement ,“Welcome to MyApp”是TiXmlText,⽂本<Farewell>Thank you for using MyApp</Farewell>//同上</Messages><Windows>//TiXmlElement,元素<Window name="MainFrame" x="5" y="15" w="400" h="250" />// Window是元素TiXmlElement ,name、x、y、h是TiXmlAttribute</Windows><Connection ip="192.168.0.1" timeout="123.456000" /></MyApp>TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。

TinyXml使用指南

TinyXml使用指南

TinyXml使用指南一、 TinyXml的特点TinyXml是一个基于DOM模型的、非验证的轻量级C++解释器。

1. SAX和DOM目前XML的解析主要有两大模型:SAX和DOM。

其中SAX是基于事件的,其基本工作流程是分析XML文档,当发现了一个新的元素时,产生一个对应事件,并调用相应的用户处理函数。

这种方式占用内存少,速度快,但用户程序相应得会比较复杂。

而DOM(文档对象模型),则是在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。

这种方式占用内存大,速度往往慢于SAX,但可以给用户提供一个面向对象的访问接口,对用户更为友好。

2. 验证和非验证对于一个特定的XML文档而言,其正确性分为两个层次。

首先是其格式应该符合XML的基本格式要求,比如第一行要有声明,标签的嵌套层次必须前后一致等等,符合这些要求的文件,就是一个合格的XML文件,称作well-formatted。

但除此之外,一个XML文档因其内容的不同还必须在语义上符合相应的标准,这些标准由相应的DTD 文件或者Schema文件来定义,符合了这些定义要求的XML文件,称作valid。

因此,解析器也分为两种,一种是验证的,即会跟据XML文件中的声明,用相应的DTD文件对XML文件进行校验,检查它是否满足DTD文件的要求。

另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。

就我所知,验证的解析器通常都是比较重量级的。

TinyXml不支持验证,但是体积很小,用在解析格式较为简单的XML文件,比如配置文件时,特别的合适。

二、 TinyXml的构建和使用1. 获取TinyXml首页在/tinyxml/index.html,从这里可以找到最新版本的源代码,目前的版本是2.3.4。

2.构建TinyXml在构建时可以选择是否支持STL,选择的话,则可以使用std::string,所以通常应该打开这个选项。

Linux下TinyXml库使用方法及实例解析

Linux下TinyXml库使⽤⽅法及实例解析 TinyXml库下载,我保存在⾃⼰的⽹盘中,可⾃⾏下载:链接:提取码:e50y⾸先介绍⼀下TinyXml类XmlBase:整个TinyXML模型的基类;XmlAttribute:对应于XML中的元素的属性;XmlComment:对应于XML中的注释,评论类;XmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>;XmlElement:对应于XML的元素;XmlDocument:对应于XML的整个⽂档;XmlText:对应于XML的⽂字部分;XmlUnknown:对应于XML的未知部分;XmlHandler:定义了针对XML的⼀些操作;类之间的关系如下:需要注意的是:元素⼀定的节点,节点不⼀定是元素(TiXmlElement类)⼀.加载XML⽂件//加载XML⽂件TiXmlDocument doc;if(!doc.LoadFile("test.xml")){qDebug()<<"加载XML⽂件失败";const char *errorStr = doc.ErrorDesc();qDebug()<<errorStr; //打印失败原因;}⼆.获取XML 的根节点//加载XML⽂件TiXmlDocument doc;if(!doc.LoadFile("test.xml")){qDebug()<<"加载XML⽂件失败";const char *errorStr = doc.ErrorDesc();qDebug()<<errorStr; //打印失败原因;}else{//获取根节点元素TiXmlElement *root = doc.FirstChildElement();}三.常⽤⽅法TiXmlDocument doc;doc.LoadFile("test.xml");TiXmlElement *root = doc.FirstChildElement(); //获取根节点元素QString ElementName = root->Value(); //获取元素名bool Children = root->NoChildren(); //判断该元素是否有⼦元素返回true 有,false 没有TiXmlElement *child = root->FirstChildElement(); //获取root元素下的第⼀个⼦元素child = root->FirstChildElement("major"); //获取root元素的⼦元素指定元素名字(major)TiXmlElement *brother = child->NextSiblingElement(); //获取child元素的下⼀个兄弟元素brother = child->NextSiblingElement("specVersion"); //获取child元素的兄弟元素指定元素名字(specVersion)QString text = brother->GetText(); //获取brother元素的值TiXmlAttribute *Attribute = brother->FirstAttribute(); //获取brother元素的第⼀个属性QString AttributeName = Attribute->Name(); //获取Attribute属性的名字QString AttributeValue = Attribute->Value(); //获取Attribute属性的值AttributeValue = brother->Attribute("AttributeName"); //获取brother的属性名为(AttributeName)的值TiXmlDocument *myDocument = new TiXmlDocument(); //创建⼀个XML⽂件TiXmlDeclaration *pDeclaration=new TiXmlDeclaration("1.0","UTF-8",""); //创建xml⽂件头(<?xml version="1.0" encoding="UTF-8" ?>)myDocument->LinkEndChild(pDeclaration); //加⼊将xml⽂件头加⼊⽂档中TiXmlElement *BUSINESS=new TiXmlElement("BUSINESS"); //创建⼀个元素节点myDocument->LinkEndChild(BUSINESS); //加⼊BUSINESS元素节点到⽂档中TiXmlElement *COUNTRY = new TiXmlElement("COUNTRY"); //创建两个节点TiXmlElement *PLANET = new TiXmlElement("PLANET");BUSINESS->LinkEndChild(PLANET); //将新建的节点加到BUSINESS下⼀级BUSINESS->LinkEndChild(COUNTRY);TiXmlText *PLANETtxt = new TiXmlText("one"); //添加节点内的⽂本TiXmlText *COUNTRYtxt = new TiXmlText("china");COUNTRY->LinkEndChild(COUNTRYtxt);PLANET->LinkEndChild(PLANETtxt);myDocument->SaveFile("test.xml"); //保存xml下⾯介绍⼀个实例解析使⽤TinyXML库进⾏解析时,只需要将其中的6个⽂件拷贝到项⽬中就可以直接使⽤了,这六个⽂件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp;XML⽂件如下---test.xml1 <School name="软件学院">2 <Class name = "C++">3 <Student name="tinyxml" number="123">4 <email>tinyxml@</email>5 <address>中国</address>6 </Student>7 <Student name="jsoncpp" number="456">8 <email>jsoncpp@</email>9 <address>美国</address>10 </Student>1112 </Class>1314 </School>~解析实例代码为:readxml.cpp1 #include<iostream>2 #include"tinyxml.h"3 #include<string>45using namespace std;67int main()8 {9const char * xmlFile = "test.xml";10 TiXmlDocument doc;11if(doc.LoadFile(xmlFile)){12 doc.Print();13 }else{14 cout << "can not parse xml school" << endl;1516 }17 TiXmlElement* rootElement = doc.RootElement();18 TiXmlElement* classElement = rootElement->FirstChildElement();19 TiXmlElement* studentElement = classElement->FirstChildElement();2021for(; studentElement != NULL; studentElement = studentElement->NextSiblingElement()){22 TiXmlAttribute* attribute0fStudent = studentElement->FirstAttribute();23for(; attribute0fStudent != NULL; attribute0fStudent = attribute0fStudent->Next()){24 cout << attribute0fStudent->Name() << " : " << attribute0fStudent->Value() << endl ;25 }26 TiXmlElement* studentContactElement = studentElement->FirstChildElement();27for(; studentContactElement != NULL; studentContactElement = studentContactElement->Ne xtSiblingElement()){28string contactType = studentContactElement->Value();29string contactValue = studentContactElement->GetText();30 cout << contactType << " : " << contactValue << endl;31 }32 }33return0;34 }35~如下为我⼯程下的⽂件csc105@csc105:~/workspace/configure-the-lower-computer/zmqcore/test_t/template/tinyxml$ lsreadxml test.xml tinystr.h tinyxmlerror.cpp tinyxmlparser.cppreadxml.cpp tinystr.cpp tinyxml.cpp tinyxml.h运⾏执⾏⽂件,解析结果为:csc105@csc105:~/workspace/configure-the-lower-computer/zmqcore/test_t/template/tinyxml$ ./readxml <School name="软件学院"><Class name="C++"><Student name="tinyxml" number="123"><email>tinyxml@</email><address>中国</address></Student><Student name="jsoncpp" number="456"><email>jsoncpp@</email><address>美国</address></Student></Class></School>name : tinyxmlnumber : 123email : tinyxml@address : 中国name : jsoncppnumber : 456email : jsoncpp@address : 美国到此,完成了XML 实例的解析最后感谢原博主:https:///qq_26374395/article/details/80171906。

C++使用TinyXML解析XML文件

C++使⽤TinyXML解析XML⽂件1.介绍 读取和设置xml配置⽂件是最常⽤的操作,TinyXML是⼀个开源的解析XML的C++解析库,能够在Windows或Linux中编译。

这个解析库的模型通过解析XML⽂件,然后在内存中⽣成DOM模型,从⽽让我们很⽅便的遍历这棵XML树。

下载TinyXML的⽹址: 使⽤TinyXML只需要将其中的6个⽂件拷贝到项⽬中就可以直接使⽤了,这六个⽂件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。

2.读取XML⽂件如读取⽂件a.xml:<ToDo><Item priority="1"><bold>Book store!</bold></Item><Item priority="2">book1</Item><Item priority="2">book2</Item></ToDo>读取代码如下:1 #include "tinyxml.h"2 #include <iostream>3 #include <string>45using namespace std;67enum SuccessEnum {FAILURE, SUCCESS};89 SuccessEnum loadXML()10 {11 TiXmlDocument doc;12if(!doc.LoadFile("a.xml"))13 {14 cerr << doc.ErrorDesc() << endl;15return FAILURE;16 }1718 TiXmlElement* root = doc.FirstChildElement();19if(root == NULL)20 {21 cerr << "Failed to load file: No root element." << endl;22 doc.Clear();23return FAILURE;24 }2526for(TiXmlElement* elem = root->FirstChildElement(); elem != NULL; elem = elem->NextSiblingElement())27 {28string elemName = elem->Value();29const char* attr;30 attr = elem->Attribute("priority");31if(strcmp(attr,"1")==0)32 {33 TiXmlElement* e1 = elem->FirstChildElement("bold");34 TiXmlNode* e2=e1->FirstChild();35 cout<<"priority=1\t"<<e2->ToText()->Value()<<endl;3637 }38else if(strcmp(attr,"2")==0)39 {40 TiXmlNode* e1 = elem->FirstChild();41 cout<<"priority=2\t"<<e1->ToText()->Value()<<endl;42 }43 }44 doc.Clear();45return SUCCESS;46 }4748int main(int argc, char* argv[])49 {50if(loadXML() == FAILURE)51return1;52return0;53 }View Code3.⽣成XML⽂件如⽣成⽂件b.xml如下所⽰:<root><Element1 attribute1="some value" /><Element2 attribute2="2" attribute3="3"><Element3 attribute4="4" />Some text.</Element2></root>⽣成上⾯b.xmlL⽂件代码如下:1 #include "tinyxml.h"2 #include <iostream>3 #include <string>4using namespace std;56enum SuccessEnum {FAILURE, SUCCESS};78 SuccessEnum saveXML()9 {10 TiXmlDocument doc;1112 TiXmlElement* root = new TiXmlElement("root");13 doc.LinkEndChild(root);1415 TiXmlElement* element1 = new TiXmlElement("Element1");16 root->LinkEndChild(element1);1718 element1->SetAttribute("attribute1", "some value");192021 TiXmlElement* element2 = new TiXmlElement("Element2"); ///元素22 root->LinkEndChild(element2);2324 element2->SetAttribute("attribute2", "2");25 element2->SetAttribute("attribute3", "3");262728 TiXmlElement* element3 = new TiXmlElement("Element3");29 element2->LinkEndChild(element3);3031 element3->SetAttribute("attribute4", "4");3233 TiXmlText* text = new TiXmlText("Some text."); ///⽂本34 element2->LinkEndChild(text);353637bool success = doc.SaveFile("b.xml");38 doc.Clear();3940if(success)41return SUCCESS;42else43return FAILURE;44 }4546int main(int argc, char* argv[])47 {48if(saveXML() == FAILURE)49return1;50return0;51 }View Code4.重要函数或类型的说明 (1)FirstChildElement(const char* value=0):获取第⼀个值为value的⼦节点,value默认值为空,则返回第⼀个⼦节点。

xml文件解析方法

xml文件解析方法XML文件解析方法引言:XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有良好的可读性和灵活性,被广泛应用于数据交换和配置文件等领域。

在处理XML文件时,解析是必不可少的环节。

本文将介绍几种常用的XML文件解析方法,包括DOM、SAX和StAX。

一、DOM解析方法DOM(文档对象模型)是一种将整个XML文件以树形结构加载到内存中的解析方法。

DOM解析器将XML文件解析为一个树状结构,通过遍历节点来获取和操作XML文件中的数据。

DOM解析方法的优点是易于理解和使用,可以随机访问XML文件中的任意节点,但缺点是占用内存较大,不适用于大型XML文件的解析。

1. 创建DOM解析器对象:使用标准的Java API,可以通过DocumentBuilderFactory类来创建DOM解析器对象。

2. 加载XML文件:通过DOM解析器对象的parse()方法加载XML文件,将其转化为一个树形结构。

3. 遍历节点:使用DOM解析器对象提供的方法,如getElementsByTagName()、getChildNodes()等,可以遍历XML文件中的各个节点,获取节点的名称、属性和文本内容等信息。

4. 获取节点数据:通过节点对象提供的方法,如getNodeName()、getTextContent()等,可以获取节点的名称和文本内容。

二、SAX解析方法SAX(简单API for XML)是一种基于事件驱动的XML解析方法。

在SAX解析过程中,解析器顺序读取XML文件,当遇到节点开始、节点结束或节点文本等事件时,会触发相应的回调方法。

相比于DOM 解析方法,SAX解析方法具有内存占用小、解析速度快的优点,但缺点是无法随机访问XML文件中的节点。

1. 创建SAX解析器对象:使用标准的Java API,可以通过SAXParserFactory类来创建SAX解析器对象。

2. 实现事件处理器:自定义一个事件处理器,实现SAX解析器提供的DefaultHandler类,并重写相应的回调方法,如startElement()、endElement()和characters()等。

利用Tinyxml进行文本解析、分词、创建索引源代码

利用Tinyxml进行文本解析、分词、创建索引源代码/*---------------------------------------数据结构------------------------------------------------*************************************************************** *scws_t scws 操作句柄(指针),大多数API 的第一参数类型,通过 `scws_new()` 返回,不要尝试拷贝 `struct scws_st` 数据,拷贝结果不保证可以正确工作。

typedef struct scws_st {struct scws_st *p;xdict_t d; // 词典指针,可检测是否为 NULL 来判断是否加载成功rule_t r; // 规则集指针,可检测是否为 NULL 来判断是否加载成功unsigned char *mblen;unsigned int mode;unsigned char *txt;int len;int off;int wend;scws_res_t res0; // scws_res_t 解释见后面scws_res_t res1;word_t **wmap;struct scws_zchar *zmap;} scws_st, *scws_t;************************************************************** scws 分词结果集,单链表结构,通过 `scws_get_result()` 返回,每次分词返回的结果集次数是不定的,须循环调用直到返回`NULL`。

typedef struct scws_result *scws_res_t;struct scws_result {int off; // 该词在原文本中的偏移float idf; // 该词的 idf 值unsigned char len; // 该词的长度char attr[3]; // 词性scws_res_t next; // 下一个词};*************************************************************** --------------------------------------数据结构-----------------------------------------*//********************************** 此代码为××所写!***********************************/#include#include#include#include#include#include#include#define SCWS_PREFIX "/usr/local/scws"using namespace std;using namespace tinyxml2; //包含需要的头文件;int main(){/*--------------------------------第一步,解析xml文件--------------------------------------------*/int i=0; //i用作统计加载的文件中的个数char sIndexName[] = "test_index"; //xapian数据库名称;XMLDocument doc;if(doc.LoadFile("/cygdrive/c/cygwin/home/Administrator/te st/all_test.xml")) //all文件为源文件部分可用内容截取;cout <<"Load the file successfully!!" <<endl;else cout <<"Failed to load the file!" <XMLNode* docsNode=doc.FirstChild(); //我在所有的节点上层新建了一层节点,作为第一个节点,目的是方便遍历xml树;XMLNode* docNode=docsNode->FirstChild(); //while(docNode!=NULL) //循环遍历所有url、title、content节点并输出检验;{const char* url=docNode->FirstChild()->FirstChild()->Value();const char* title=docNode->FirstChild()->NextSibling()->FirstChild()->Valu e();const char* content=</endl;docNode->FirstChild()->NextSibling()->NextSibling()->First Child()->Value();cout <<<endl;cout <//异常处理;cout << "Exception: " << error.get_msg() << endl;}docNode=docNode->NextSibling(); //docNode向下挪一位,继续遍历下一个;i++; //统计一共加载了多少个;}cout <<"一共加载文档" <<<"篇"="" <<endl; return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ a r g l d a r g ;
整个 T i n g x m l 解析库的构成主要 由 D O M模型类 和操 作类 构成 。 D O M模型类包括 : T i X M L B a s e ( 模型基类 ) 、 T i XM L A t t r i b u t e
( 元 素 属 性类 ) 、 T i X M L N o d e( 应用 于 D O M结 构 节 点 ) 、
T i X ML C o m me n t ( X ML 中 的 注 释 类 ) 、 T i X ML D e c l ra a t i o n ( 应 用 于
T i X ML D o c u m e n t m y D o c u m e n t ( XML p a t h ) ; f根据 路径获取
据, 无需顾 虑格式 , 只要求标签 的成对 出现并 按照树状结构存 储 即可 , 所以能很好 的表 达数据本身 , 适 合进行 数据 的存储 和 传递 , 可 以用来描述各种复杂信息。
2 C+ + XML解 析 器 ( T i n g x m1 )
X M L的解 析 技 术作 为其 应 用 的 基 础 ,一 直 是 X ML的 研究
热点 [ 2 1 。由于 c + +中本身 未包含解析 X ML的函数库 ,所 以当
c + +需要对 XM L进行解析时常使用 c + + x ML解析器来完成 。
本 文主要介绍 基于 T i n g x m l 解析器 的 c + + X ML解 析 ,
T i n g x ml 是 一个基 于 D O M模 型的轻量 级 X M L解 析器 ,其 模型
多个属性和多个值时仅用 m a p是无法满足使用需要的。为此 , 本文采用 v e c t o r 、结构体和 m a p相ห้องสมุดไป่ตู้套的方法实现单个节点含
数据传 输和交 换的标 准语 言, 为不 同应用程 序间的数据传输 和 交换提供了一种简单的方法 【 l J 。X ML独立于任何语言和体系结 构 ,是一种灵活 的不局限 于任何 特定模式 的半结构化文本数
S T L ( 标准模板库 ) 是c + +开发 中用于数据存储所必不 可少 的函数库 , 其中的存储容器包括 : 向量 ( v e c t o r ) ; 列表 ( 1 i s t ) ; 集合 ( s e t ) ; 映射( m a p ) 等 。 在对 XM L进行数据解析 的时候 , 基于 X M L的特性 , 我们 很容易 可以想到去使用关联 容器来对解 析出来 的数据进行存 储。 但S T L库 中的关联容器映射( ma p ) 中的 k e y / v a l u e 存储方式 仅能满足数据名和数据值得存储 ,当 X M L的一个节点上含有
通过解 析 X ML , 在 内存 中生成 D O M模 型 , 将整个 文档分 成多
m a p < C S t r i n g , C S l r i n g >V a l u e s ; / / 用于存储 X M L 文件 中各节
点的值信息} ;
v e c t o r< a r g l >A t t r u s ; / / 创 建一个 v e c t o r< a r g l >类 型 的
技 经 济市 场
基于 T i n g x ml 的X M L数 据解析方法研 究
张 冲
( 江 西理 工 大学 , 江西 赣 州 3 4 1 0 0 0 )
摘 要: X M L 是 一种仅基于普 通文本 却可 以实现任何两个应该程序 间的数据共享 的文本语 言。本 文在 简单介 绍 X M L的基础 上,通 过 c + +解析器 T i n g x m l 实现 c + +对多值 多属性 X M L 文件 的读取和存储 , 并对 T i n g x m l 解析器在 A S C I I (  ̄字节 字符集) 项 目中读 取 X M L 过 程中出现的不支持 中文字符 问题进行解决。 关键词 : X M L ; T i n g x m l ; 中文字符; S T L
整个 XM L文 档 m y D o c u m e n t . L o a d F i l e 0 ; / / 下载 x ml 文 档 T i X ML E l e me n t r o o t E l e me n t= my D o c u m e n t . R o o t E l e me n t 0 ; / / 加 载根 目录
个元素 ( 如书 、 章、 节、 段等 ) , 并利用树型 结构表示这些元 素之 间的顺序关系 以及嵌套包含关系 , 从而让我们很方便 的遍历这
棵X ML树 。
v e c t o r 用于存储 X ML文件中各节点信息
R e a d X ML ( c o n s t c h a r X ML p a t h )
1 × ML简 介
可 扩展 性 标记 语 言 ( E x t e n s i b l e Ma r k u p L a n g u a g e ,简称 X M L ) 是 W3 C ( Wo d d Wi d e We b C o n s o r t i u m ) 定义的一种程序 间
有多个属性和多个值 的 X ML的解析 ,并将数据 的属性 和值分 开存储 以方便使用 。具体实现方法如下 : s t r u c t a r g l / / 创建一个 包含两个 r n a p < C S t r i n g , C S t r i n g >类型
的结构体 { m p< a C S t r i n g , C S t r i n g >A t t i r b u t e s ; / / 用于 存储 X ML文件 中 各节点 的属性信息
T i XML E l e me n t 木 f i l e A r g s E kme n t = r 0 o t El e me n t 一 > F i r s t C h i l d E 1 e
相关文档
最新文档