一、xml结构介绍
1XML的声明
这是一个XML处理指令。处理指令以<?开始,以?>结束。<?后的第一个单词是指令名,如xml,代表XML声明。
version,standalone,encoding是三个特性,特性是由等号分开的名称-数值对,等号左边是特性名称,等号右边是特性的值,用引号引起来。
几点解释:
- version:说明这个文档符合1.0规范
- standalone:说明文档在这一个文件里还是需要从外部导入,standalone的值设为yes说明所有的文档都在这一文件里完成
- encoding:指文档字符编码
2XML根元素定义
XML文档的树形结构要求必须有一个根元素。根元素的起始标记要放在所有其它元素起始标记之前,根元素的结束标记根放在其它所有元素的结束标记之后,如
< Settings >
Person > ZhangSan </ >
3XML元素
需要注意的是:
XML元素标记命名规则如下:
- 名字中可以包含字母,数字及其它字母
- 名字不能以数字或下划线开头
- 名字不能用xml开头
- 名字中不能包含空格和冒号
4XML中的注释
XML中注释如下:
需要注意的是:
- 注释中不要出现“--”或“-”
- 注释不要放在标记中
- 注释不能嵌套
5PI (Processing Instruction)
PI指Processing Instruction,处理指令。PI以“<?”开头,以“?>”结束,用来给下游的文档传递信息。
例子表明这个XML文档用core.css控制显示。
6PCDATA
#PCDATA:specifies that an element will contain parsed character data.
举例说明PCDATA的用法,其中movies.xml存储电影内容数据,movies.dtd对movies.xml进行验证。
示例文件(movies.dtd)
XML文件如下所示(movies.xml):
7CDATA
CDATA用于需要把整段文本解释成纯字符数据而不是标记的情况。当一些文本中包含很多“<”,“>”,“&”,“””等字符而非标记时,CDATA会非常有用。
<Person>
<Name>ZhangSan</Name>
<Sex>Male</Sex>
</Person>
]]>
>
以“<![CDATA[” 开始,以“]]>”结束。注意,在CDATA段中不要出现结束定界符“]]>”。
8Entities(实体)
Entities(实体)是XML的存储单元,一个实体可以是字符串,文件,数据库记录等。实体的用处主要是为了避免在文档中重复输入,我们可以为一个文档定义一个实体名,然后在文档里引用实体名来代替这个文档,XML解析文档时,实体名会被替换成相应的文档。
XML为五个字符定义了实体名:
实体 |
字符 |
< |
< |
> |
> |
& |
& |
" |
“ |
' |
‘ |
定义并引用实体的示例:
<!ENTITYintro"HereissomecommentforentityofXML" >
]>
example hello > &intro;
9DOCTYPE
“<!DOCTYPE[]>”紧随XML声明,包括所有实体的声明,如下所示:
declareyourentitieshere…
] >
Bodyofdocument…
>
二、xml数据解析
在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GdataxML。这篇文章使用了NSXMLParser。
解析 XML 通常有两种方式,DOM 和 SAX:
NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。
1、初始化NSXMLParser
要使用NSXMLParser要先创建它,设置各种属性,主要用到以下几个方法:
initWithContentsOfURL 通过NSURL创建解析器
initWithData 通过NSData创建解析器
setDelegate 为解析器定义委托
parse 运行解析器
- NSXMLParser*parser=[[NSXMLParseralloc]initWithData:[xmldataUsingEncoding:NSUTF8StringEncoding]];
- NSXMLParser*parser=[[NSXMLParseralloc]initWithContentsOfURL:[NSURLURLWithString:@"http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml"]];
- [parsersetDelegate:self];//设置NSXMLParser对象的解析方法代理
- [parsersetShouldProcessNamespaces:NO];
- [parserparse];//开始解析
2、委托方法
主要使用一下委托方法:
- //发现元素开始符的处理函数(即报告元素的开始以及元素的属性)
- -(void)parser:(NSXMLParser*)parser
- didStartElement:(NSString*)elementName
- namespaceURI:(NSString*)namespaceURI
- qualifiedName:(NSString*)qName
- attributes:(NSDictionary*)attributeDict
- //处理标签包含内容字符(报告元素的所有或部分内容)
- -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string
- //发现元素结束符的处理函数,保存元素各项目数据(即报告元素的结束标记)
- -(void)parser:(NSXMLParser*)parser
- didEndElement:(NSString*)elementName
- namespaceURI:(NSString*)namespaceURI
- qualifiedName:(NSString*)qName
- //报告解析的结束
- -(void)parserDidEndDocument:(NSXMLParser*)parser
- //报告不可恢复的解析错误
- -(void)paser:parserErrorOccured
1、didStartElement
2、foundCharacters
3、didEndElement
示例如下:
- -(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qNameattributes:(NSDictionary*)attributeDict{
- NSLog(@"xml_parserstart%@",elementName);
- if([elementNameisEqualToString:@"person"]){
- NSLog(@"xml_parserperson");
- if(personNameArrary==nil){
- personNameArrary=[[NSMutableArrayalloc]init];
- }
- }
- if(itemValue!=nil){
- itemValue=nil;
- }
- itemValue=[[NSMutableStringalloc]init];
- if([elementNameisEqualToString:@"phone"]){
- NSString*atr=[attributeDictvalueForKey:@"type"];
- NSLog(@"xml_parserphonetype:%@",atr);
- }
- }
- -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string{
- NSLog(@"xml_parservalue:%@",string);
- [itemValueappendString:string];
- }
- -(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName{
- NSLog(@"xml_parserend%@",elementName);
- if([elementNameisEqualToString:@"firstName"]){
- [personNameArraryaddObject:itemValue];
- }
- if([elementNameisEqualToString:@"person"]){
- NSLog(@"xml_parserpersonend");
- }
- }
NSXMLParser DEMO 下载 原文链接:https://www.f2er.com/xml/298935.html