您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > EasyXML使用指南
EasyXML使用指南文档信息项目名称EasyXML-通用XML解析器需求编号文档编号作者曾臻创建日期2006-3-10版本号1.0审核人审核日期修改记录修改日期作者说明审核人1引言EasyXML是为C++开发的XML解析器,它利用了C++的函数重载、函数对象等语言特性方便了程序员对XML解析代码的编写。本库不依赖于其它的XML解析器(如XML4C),实现上完全基于STL。2指南2.1例子2.1.1XML的生成下面这段代码演示了怎样使用EasyXML来生成XML文档:#includepub_easy_xml.h#includestring#includeiostream#includefstreamvoidmain(){//createrootelementElementinfo(info,Element::ROOT|Element::COMPLEX);//createandassemblepetelementsElementpet(pet);pet.setAttribute(species,mouse)(sex,female)(age,1)(name,Jerry)(weight,200g);info.addChild(pet);pet(species)=cat;pet(sex)=male;pet(age)=2;pet(name)=Tom;pet(weight)=2kg;info.addChild(pet);//createandassemblebandelementsElementband(band);band.setAttribute(name,BEYOND)(style,ArtRock)(members,5)(birthday,1983);Elementmember(member);member.addChild(name,HuangJiaJu)(position,Voice,LeadGuitar);band.addChild(member);member[name]=HuangJiaQiang;member[position]=Bass;band.addChild(member);info.addChild(band);//generatexmlstringstringoutXml;Parserparser;parserinfooutXml;//outputtoxmlfileofstreamof(info.xml);ofoutXml;of.close();}生成的info.xml内容如下:2.1.2XML的解析下面这段代码演示了怎样使用EasyXML来解析XML文档:#includepub_easy_xml.h#includestring#includeiostream#includefstreamvoidmain(){//inputfromxmlfileifstreamfile(info.xml);stringinXml;while(!file.eof())inXml+=file.get();file.close();//parsexmlstringParserparser;Elementinfo;parserinXmlinfo;//accesselementthroughoperatorcoutThefirstpet'nameisinfo[pet][0](name)endl;coutThefirstmemberofthefirstbandisinfo[band][0][member][0][name].getValue()endl;//accesselementthroughreferenceElement&mouse=info[pet][1];coutThesecondpet'snameismouse(name)endl;//accesselementthroughindexcoutendlListofallpets:endl;Element&pet=info[pet];for(longindex=0;indexpet.getCount();index++){Element&e=pet[index];coutNo.index+1endl;coutspecies:e(species)endl;coutname:e(name)endl;coutage:e(age)endl;coutsex:e(sex)endl;}//accesselementthroughiteratorcoutendlListofallmembersofBEYOND:endl;Element&member=info[band][0][member];for(Element*pe=member.firstElement();member.hasMoreElements();pe=member.nextElement()){Element&e=*pe;coute[name].getValue()isplayinge[position].getValue()inthebandendl;}}运行结果如下:Thefirstpet'nameisJerryThefirstmemberofthefirstbandisHuangJiaJuThesecondpet'snameisTomListofallpets:No.1species:mousename:Jerryage:1sex:femaleNo.2species:catname:Tomage:2sex:maleListofallmembersofBEYOND:HuangJiaJuisplayingVoice,LeadGuitarinthebandHuangJiaQiangisplayingBassintheband3详细介绍3.1Element组件3.1.1基本概念Element用来描述XML的元素,它可以分为复合元素和非复合元素。非复合元素属于XML结构树中“叶子”,用于存放文本信息;复合元素是任意元素的容器,不可以存放信息。如图,member就是复合元素,name和position都是非复合元素。XML元素还可以分为可重复元素和不可重复元素。可重复元素用来描述所有结构相同的同名元素,不可重复元素则只能描述独一无二的元素。如图,pet和member是可重复元素;info,name和position是不可重复元素;band是可重复元素,只不过它当前的重复度为1。还有一种XML元素叫根元素,它表示一个XML文档中唯一的那个顶层元素,根元素不能是可重复元素,可以是复合元素或非复合元素。如图,info就是根元素。XML元素还可以携带若干个属性信息。3.1.2Element的创建在Element中用了下面这样一个枚举来表示元素类型:enumElementType{REPEATABLE=0x1,COMPLEX=0x2,SIMPLE=0x0,ROOT=0x4};Element的一个构造方法定义如下:explicitElement(conststring&str_name,intn_type=COMPLEX);参数一表示元素名,参数二表示元素类型,缺省值是复合元素。元素类型可以通过运算符|进行组合,REPEATABLE不能和ROOT组合。例如,要构造一个前面提到的可重复的复合元素member可以这么写:Elemente(member,Element::REPEATABLE|Element::COMPLEX);要构造一个复合顶层元素root可以这么写:Elemente(info,Element::ROOT|Element::COMPLEX);3.1.3Element的组装可以用过下面几种方式把一个元素组装到另一个复合元素中:1.以Element的引用为参数加入已存在的子元素,子元素可以是任意类型member.addChild(name)(position);2.以元素名和元素值(可缺省)为参数加入子元素,这将生成一个新的携带着给定值(或缺省)的非复合型的元素pet.addChild(species,dog)(name)//缺省元素值为空字符串(age,2)//整型元素值将被装换成字符串(sex,male)(weight,2kg);应该注意的是,当加入新的不可重复的元素时,如果容器中已经存在同名元素,则新元素将合并到容器中的同名元素中,如果容器中的同名元素是不可重复型的,则它将在合并后转变为可重复型的。3.1.4Element的属性设置用以下几种方式可以设置元素的属性:1.用setAttribute()pet.setAttribute(species,mouse)(sex,female)(age,1)(name,Jerry)(weight,200g);2.通过重载操作符()pet(species)=cat;pet(sex)=male;pet(age)=2;pet(name)=Tom;pet(weight)=2kg;3.1.5Element的访问3.1.5.1访问元素值1.通过getValue()/setValue()访问值Elementelement(element,Element::SIMPLE);stringvalue=element.getValue();element.setValue(thitisvalue);element.setValue(12);//值将被转换为string2.通过重载操作符=赋值,重载类型转换string()获取值Elementelement(element,Element::SIMPLE);stringvalue=element;element=thisisvalue;element=12;//值将被转换为string3.1.5.2访问属性1.通过getAttribute()访问属性stringname=pet.getAttribute(name);2.通过重载操作符()反问属性stringname=pet(name);这两种方式的区别在于:前者获取的属性必须是存在的,否则会抛出异常;当后者获取的属性不存在时将会自动将其设为空字符串,并返回其引用。3.1.5.3访问子元素1.通过getChild()访问子元素Element&name=member.getChild(name);2.通过重载操作符[]访问子元素Element&name=member[name];这两种方式的区别在于:当前者获取的子元素不存在时,将返回一个空元素的引用(空元素的表示不存在的元素它的重复度为0,相当与集合中的空集);当后者获取的元素不存在时,将会自动生成相应的子元素——该元素的类型为SIMPLE,并返回其引用。于是我们可以像下面这样设置子元素:member[name]=HuangJiaQiang;member[position]=Bass;3.1.5.4访问可重复元素1.通过elementAt()访问可重复元素Element&mouse=pet.elementAt(1);2.通过重载操作符访问可重复元素Element&e=pet[index];这两种方式没有区别,都表示从元素pet所描述的一系列的同名元素中获得某个元素的引用,当索引超出容器范围时会抛出异常。3.通过迭代器遍历可重复元素,请注意firstElement(),hasMoreElements(),nextElement()的用法coutendlListofallmembersofBEYOND:endl;Element&member=info[band][0][member];for(Element*pe=member.firstElement();member.hasMoreElements();pe=member.nextElement()){
本文标题:EasyXML使用指南
链接地址:https://www.777doc.com/doc-2871502 .html