libxml2解析xml文件|如何用python读取xml文件

|

1. ios怎么解析xml的demo

ios中如何解析xml文件两种方法:1.ios中已有的NSXMLParse类 2.Google的GDataXML也是基于libxml2的,因此在使用GDataXML之前,你需要先导入libxml2。这里详解ios中的nsxmlparse:NSXMLParser 实现的是sax方法解析xml文件。dom实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。他的主要优势是实现简单,读写平衡;缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。sax的实现方法和dom不同。他只在xml文档中查找特定条件的内容,并且只提取需要的内容。这样做占用内存小,灵活,正好满足我们的需求。他的缺点就是写,有些资料介绍了写入的方法,但是我感觉这对本例没有必要。运行NSXMLParser涉及设置、运行和响应结果。1)启动NSXMLParser要使用NSXMLParser要先创建它,设置各种属性,主要用到以下几个方法:initWithContentsOfURL 通过NSURL创建解析器initWithData 通过NSData创建解析器setDelegate 为解析器定义委托parse 运行解析器2)充当委托最重要的5个方法: //发现元素开始符的处理函数 (即报告元素的开始以及元素的属性) – (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict//处理标签包含内容字符 (报告元素的所有或部分内容) – (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string//发现元素结束符的处理函数,保存元素各项目数据(即报告元素的结束标记)- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName//报告解析的结束 – (void)parserDidEndDocument:(NSXMLParser *)parser//报告不可恢复的解析错误- (void)paser:parserErrorOccured1.申明了一个xml处理协议,用到NSXMLParser协议,用来具体处理我们要解析的xml文件,把需要的url取出来,存到指定的data里。 *///多线程处理类的定义,方法实现,与向主线程回传data@class AppRecord;//@protocol ParseOperationDelegate;@protocol ParseOperationDelegate- (void)didFinishParsing:(NSArray *)appList;- (void)parseErrorOccurred:(NSError *)error;@end@interface ParseOperation : NSOperation {@private id <</span>ParseOperationDelegate> delegate;//,NSXMLParserDelegate NSData *dataToParse; NSMutableArray *workingArray; AppRecord *workingEntry; NSMutableString *workingPropertyString; NSArray *elementsToParse; BOOL storingCharacterData;}- (id)initWithData:(NSData *)data delegate:(id <<span class="s13">ParseOperationDelegate>)theDelegate;@end然后完成协议的初始化函数- (id)initWithData:(NSData *)data delegate:(id <<span class="s13">ParseOperationDelegate>)theDelegate{ self = [super init]; if (self != nil) { self.dataToParse = data; self.delegate = theDelegate; self.elementsToParse = [NSArray arrayWithObjects:kIDStr, kNameStr, kImageStr, kArtistStr, nil]; } return self;}2.完成对特定标签的解析#pragma mark -#pragma mark RSS processing- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ // entry: { id (link), im:name (app name), im:image (variable height) } // if ([elementName isEqualToString:kEntryStr]){ self.workingEntry = [[[AppRecord alloc] init] autorelease]; } storingCharacterData = [elementsToParse containsObject:elementName];}3.找到具体的地址与内容,并存储- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if (self.workingEntry){ if (storingCharacterData) { NSString *trimmedString = [workingPropertyString : [NSCharacterSet ]]; [workingPropertyString setString:@""]; // clear the string for next time if ([elementName isEqualToString:kIDStr]) { self.workingEntry.appURLString = trimmedString; } else if ([elementName isEqualToString:kNameStr]) { self.workingEntry.appName = trimmedString; } else if ([elementName isEqualToString:kImageStr]) { self.workingEntry.imageURLString = trimmedString; } else if ([elementName isEqualToString:kArtistStr]) { self.workingEntry.artist = trimmedString; } } else if ([elementName isEqualToString:kEntryStr]) { [self.workingArray addObject:self.workingEntry]; self.workingEntry = nil; } } }- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ if (storingCharacterData) { [workingPropertyString appendString:string]; }}第三方解析方法:::::::::::: 简介:采用KissXML第三方程序集来实现,需要引入libxml2.dylib(另需注意运行时可能会提示“libxml/tree.h找不到“的问题, 解决办法: 在项目的 TARGETS 中选择一个目标,在右侧切换到 Build Settings 页,向下找到 Search Paths 段,其中有一个 Header Search Paths 项,将其值设为:/usr/include/libxml2)如下图: ProvinceCity.xml文件格式如下图:程序主要代码如下: #import"DDXML.h"#import"DDXMLElementAdditions.h" @implementation ViewController//解析XMLstaticNSString *kXML =@"//District//Province";- (void)viewDidLoad{ [superviewDidLoad]; NSString *path =[[NSStringalloc]initWithString:[[NSBundlemainBundle]pathForResource:@"ProvinceCity"ofType:@"xml"]]; NSData *data = [[NSDataalloc]initWithContentsOfFile:path]; [selfparsedDataFromData:dataandProvince:@"江西省"];[selfparsedDataFromData:data];[datarelease];}//取特定省份下包含所有城市-(void)parsedDataFromData:(NSData *)data andProvince:(NSString *)province{DDXMLDocument *doc = [[DDXMLDocumentalloc]initWithData:dataoptions:0error:nil]; /////解析NSArray *items = [docnodesForXPath:kXMLerror:nil]; for (DDXMLElement *objin items) { DDXMLNode *aUser = [obj attributeForName:@"Name"];//取属性Name的值 if ([aUser.stringValueisEqualToString:province]) { NSArray *CityLst = [obj elementsForName:@"City"];//取城市点点列表,保存到数组中 if(CityLst.count>0)//第二层 { for (DDXMLElement *citysin CityLst) { DDXMLNode *citynode=[citys attributeForName:@"Name"]; NSLog(@"%@",citynode.stringValue); } } } } [doc release];}//取所有省份及其下级节点,包含修改操作-(void)parsedDataFromData:(NSData *)data{DDXMLDocument *doc = [[DDXMLDocumentalloc]initWithData:dataoptions:0error:nil]; /////解析NSArray *items = [docnodesForXPath:kXMLerror:nil]; for (DDXMLElement *objin items) {DDXMLNode *aUser = [objattributeForName:@"Name"];//取属性Name的值 //[aUser setStringValue:@"haha!"];//修改属性节点的值 [objaddAttribute:[DDXMLNodeattributeWithName:@"test"stringValue:@"wzh"]];//增加一个属性节点 [objaddAttributeWithName:@"ttt"stringValue:@"343"];//再增加一个属性节点 //[obj setStringValue:@"NewNode"];//设置当前节点的值 DDXMLNode *newnode=[DDXMLNodeelementWithName:@"newNode"];//设置一个新的节点 [obj addChild:newnode];//给obj添加一个节点 DDXMLElement *newdxml = [[objelementsForName:@"newNode"]objectAtIndex:0];//访问刚刚添加的节点 [newdxmladdAttributeWithName:@"nodetwo"stringValue:@"twovalue"];//给刚添加的节点增加增的下级节点,并且下级节点再一个属性值 DDXMLNode *newnode2=[DDXMLNodeelementWithName:@"newNode2"stringValue:@"hello!"]; [newdxmladdChild:newnode2];} //保存到沙盒目录下 NSString *path =[[NSStringalloc]initWithFormat:@"%@/xmlData.xml", [(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0]]; NSString *result=[[NSStringalloc]initWithFormat:@"%@",doc]; [resultwriteToFile:pathatomically:YESencoding:NSUTF8StringEncoding error:nil]; //[result2 writeToFile:path atomically:YES];//这种方法不行,保存后会有乱码 [result release]; [path release]; [doc release];}

2. 如何用python读取xml文件

一、简介

XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用。它是web发展到一定阶段的必然产物,既具有SGML的核心特征,又有着HTML的简单特性,还具有明确和结构良好等许多新的特性。python解析XML常见的有三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合,注意xml.dom包里面有许多模块,须区分它们间的不同;二是xml.sax.*模块,它是SAX API的实现,这个模块牺牲了便捷性来换取速度和内存占用,SAX是一个基于事件的API,这就意味着它可以“在空中”处理庞大数量的的文档,不用完全加载进内存;三是xml.etree.ElementTree模块(简称 ET),它提供了轻量级的Python式的API,相对于DOM来说ET 快了很多,而且有很多令人愉悦的API可以使用,相对于SAX来说ET的ET.iterparse也提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。二、详解

解析的xml文件(country.xml):在CODE上查看代码片派生到我的代码片

<?xml version="1.0"?><data><country name="Singapore"><rank>4</rank><year>2011</year><gdppc>59900</gdppc><neighbor name="Malaysia" direction="N"/></country><country name="Panama"><rank>68</rank><year>2011</year><gdppc>13600</gdppc><neighbor name="Costa Rica" direction="W"/><neighbor name="Colombia" direction="E"/></country></data>

1、xml.etree.ElementTree

ElementTree生来就是为了处理XML,它在Python标准库中有两种实现:一种是纯Python实现的,如xml.etree.ElementTree,另一种是速度快一点的xml.etree.cElementTree。注意:尽量使用C语言实现的那种,因为它速度更快,而且消耗的内存更少。在CODE上查看代码片派生到我的代码片

try:import xml.etree.cElementTree as ETexcept ImportError:import xml.etree.ElementTree as ET

这是一个让Python不同的库使用相同API的一个比较常用的办法,而从Python 3.3开始ElementTree模块会自动寻找可用的C库来加快速度,所以只需要import xml.etree.ElementTree就可以了。在CODE上查看代码片派生到我的代码片

#!/usr/bin/evn python#coding:utf-8try:import xml.etree.cElementTree as ETexcept ImportError:import xml.etree.ElementTree as ETimport systry:tree = ET.parse("country.xml") #打开xml文档#root = ET.fromstring(country_string) #从字符串传递xmlroot = tree.getroot() #获得root节点except Exception, e:print "Error:cannot parse file:country.xml."sys.exit(1)print root.tag, "—", root.attribfor child in root:print child.tag, "—", child.attribprint "*"*10print root[0][1].text #通过下标访问print root[0].tag, root[0].textprint "*"*10for country in root.findall('country'): #找到root节点下的所有country节点rank = country.find('rank').text #子节点下节点rank的值name = country.get('name') #子节点下属性name的值print name, rank#修改xml文件for country in root.findall('country'):rank = int(country.find('rank').text)if rank > 50:root.remove(country)tree.write('output.xml')

运行结果:

三、总结(1)Python中XML解析可用的类库或模块有xml、libxml2 、lxml 、xpath等,需要深入了解的还需参考相应的文档。(2)每一种解析方式都有自己的优点和缺点,选择前可以综合各个方面的性能考虑。(3)若有不足,请留言,在此先感谢!

3. c语言如何解析xml并将所有内容存入数组

/*前段时间恰好做过类似的东西,代码可以给你参考下。*Xml配置见最后*/typedefstructSrcFileFmt{intColID;charColCode[64];/*字段英文名称*/charColName[128];/*字段中文名称*/charColType[20];/*字段类型(包含长度)*/charColComment[128];/*字段描述*/}SrcFileFmt;intmain(intargc,char**argv){SrcFileFmtSrcFileFmt[128];intiNum=-1;if(2>argc){printf("Usage:%sSrcXmlFile",argv[0]);return-1;}iNum=parseSourceCfg(SrcCfgFile,SrcFileFmt);if(iNum==-1){return-1;}return0;}/*调用此函数后,xml文件的内容会被存储到结构体数组SrcFileFmtsrcfilefmt[]中*此函数依赖于libxml2-2.9.2.tar.xz*/intparseSourceCfg(char*FileName,SrcFileFmtsrcfilefmt[]){/*解析源文件xml,FileName为源xml文件名*/xmlDocPtrdoc;xmlNodePtrcur,root;charsFileName[64]={''};intcnt=0;if(FileName==NULL){return-1;}sprintf(sFileName,"%s.xml",FileName);doc=xmlParseFile(sFileName);if(doc==NULL){return-1;}root=xmlDocGetRootElement(doc);if(root==NULL){xmlFreeDoc(doc);return(-1);}if(xmlStrcmp(root->name,(constxmlChar*)"SrcRoot")){xmlFreeDoc(doc);return-1;}cur=root->xmlChildrenNode;while(cur!=NULL){if((!xmlStrcmp(cur->name,(constxmlChar*)"Column"))){xmlChar*key;xmlNodePtrcur_sub=cur;cur_sub=cur_sub->xmlChildrenNode;while(cur_sub!=NULL){if((!xmlStrcmp(cur_sub->name,(constxmlChar*)"ColID"))){key=xmlNodeListGetString(doc,cur_sub->xmlChildrenNode,1);killblank((char*)key);srcfilefmt[cnt].ColID=atoi((char*)key);xmlFree(key);}if((!xmlStrcmp(cur_sub->name,(constxmlChar*)"ColCode"))){key=xmlNodeListGetString(doc,cur_sub->xmlChildrenNode,1);killblank((char*)key);strcpy(srcfilefmt[cnt].ColCode,(char*)key);xmlFree(key);}elseif((!xmlStrcmp(cur_sub->name,(constxmlChar*)"ColName"))){key=xmlNodeListGetString(doc,cur_sub->xmlChildrenNode,1);killblank((char*)key);strcpy(srcfilefmt[cnt].ColName,(char*)key);xmlFree(key);}elseif((!xmlStrcmp(cur_sub->name,(constxmlChar*)"ColType"))){key=xmlNodeListGetString(doc,cur_sub->xmlChildrenNode,1);killblank((char*)key);strcpy(srcfilefmt[cnt].ColType,(char*)key);xmlFree(key);}elseif((!xmlStrcmp(cur_sub->name,(constxmlChar*)"ColComment"))){key=xmlNodeListGetString(doc,cur_sub->xmlChildrenNode,1);killblank((char*)key);strcpy(srcfilefmt[cnt].ColComment,(char*)key);xmlFree(key);}cur_sub=cur_sub->next;}cnt++;}cur=cur->next;}xmlFreeDoc(doc);returncnt;}<SrcRoot><Column><ColID>1</ColID><ColCode>kmh</ColCode><ColName>字段1</ColName><ColType>VARCHAR(11)</ColType></Column><Column><ColID>2</ColID><ColCode>dfkmh</ColCode><ColName>字段2</ColName><ColType>VARCHAR(11)</ColType></Column><Column><ColID>3</ColID><ColCode>hbh</ColCode><ColName>字段3</ColName><ColType>INTEGER(10)</ColType></Column></SrcRoot>


赞 (0)