微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml结构解释、数据解析

一、xml结构介绍

1XML的声明

<? xmlversion=”1.0”standalone=”yes”encoding=”UTF-8” ?>


这是一个
XML处理指令。处理指令以<?开始,以?>结束。<?后的第一个单词是指令名,如xml,代表XML声明。
version,standalone,encoding是三个特性,特性是由等号分开的名称-数值对,等号左边是特性名称,等号右边是特性的值,用引号引起来。

几点解释:

  • version:说明这个文档符合1.0规范
  • standalone:说明文档在这一个文件里还是需要从外部导入,standalone的值设为yes说明所有的文档都在这文件里完成
  • encoding:指文档字符编码


2
XML根元素定义

XML文档的树形结构要求必须有一个根元素。根元素的起始标记要放在所有其它元素起始标记之前,根元素的结束标记根放在其它所有元素的结束标记之后,如

?>
< Settings >
Person > ZhangSan </ >


3
XML元素

元素的基本结构由开始标记,数据内容,结束标记组成,如

Name Sex > Male
需要注意的是:

  • 元素标记区分大小写,<Name><name>是两个不同的标记
  • 结束标记必须有反斜杠,如</Name>

XML元素标记命名规则如下:

  • 名字中可以包含字母,数字及其它字母
  • 名字不能以数字或下划线开头
  • 名字不能用xml开头
  • 名字中不能包含空格和冒号


4
XML中的注释

XML中注释如下:

<!-- thisiscomment -->


需要注意的是:

  • 注释中不要出现“--”或“-
  • 注释不要放在标记
  • 注释不能嵌套


5
PI (Processing Instruction)
PIProcessing Instruction,处理指令。PI以“<?”开头,以“?>”结束,用来给下游的文档传递信息。

xml:stylesheethref=”core.css”type=”text/css”
例子表明这个
XML文档用core.css控制显示


6
PCDATA
#PCDATA
:specifies that an element will contain parsed character data.
举例说明PCDATA用法,其中movies.xml存储电影内容数据,movies.dtdmovies.xml进行验证。

示例文件(movies.dtd)

xmlversion="1.0"encoding="GB2312" <! ELEMENTmovies(id,name,brief,time) ATTLISTmoviestypeCDATA#required ELEMENTid(#PCDATA) ELEMENTname(#PCDATA) ELEMENTbrief(#PCDATA) ELEMENTtime(#PCDATA) id,time只能包含非标记文本(不能有自己的子元素)


XML文件如下所示(movies.xml):

DOCTYPEmoviesSYstem"movies.dtd" movies type ="动作片" id > 1 name > 致命摇篮 brief > 李连杰最新力作 time > 2003 movies
7
CDATA

CDATA用于需要把整段文本解释成纯字符数据而不是标记的情况。当一些文本中包含很多“<,>,&,”等字符而非标记时,CDATA会非常有用。

Example <![CDATA[
<Person>
<Name>ZhangSan</Name>
<Sex>Male</Sex>
</Person>
]]>
>


以“
<![CDATA[” 开始,以“]]>”结束。注意,在CDATA段中不要出现结束定界符“]]>”。


8
Entities(实体)
Entities(实体)XML的存储单元,一个实体可以是字符串,文件数据库记录等。实体的用处主要是为了避免在文档中重复输入,我们可以为一个文档定义一个实体名,然后在文档里引用实体名来代替这个文档,XML解析文档时,实体名会被替换成相应的文档。

XML为五个字符定义了实体名:

实体

字符

&lt;

<

&gt;

>

&amp;

&

&quot;

&apos;


定义并引用实体的示例:

DOCTYPEexample[
<!ENTITYintro"HereissomecommentforentityofXML" >
]>
example hello > &intro;
9
DOCTYPE
<!DOCTYPE[]>”紧随XML声明,包括所有实体的声明,如下所示:

DOCTYPEexample[
declareyourentitieshere…
] >
Bodyofdocument…
>

二、xml数据解析

在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GdataxML。这篇文章使用了NSXMLParser。

解析 XML 通常有两种方式,DOM 和 SAX:

  • DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
  • SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。

NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。

1、初始化NSXMLParser

要使用NSXMLParser要先创建它,设置各种属性,主要用到以下几个方法

initWithContentsOfURL 通过NSURL创建解析器

initWithData 通过NSData创建解析器

setDelegate 为解析器定义委托

parse 运行解析器

  1. NSXMLParser*parser=[[NSXMLParseralloc]initWithData:[xmldataUsingEncoding:NSUTF8StringEncoding]];
  2. NSXMLParser*parser=[[NSXMLParseralloc]initWithContentsOfURL:[NSURLURLWithString:@"http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml"]];
  3. [parsersetDelegate:self];//设置NSXMLParser对象的解析方法代理
  4. [parsersetShouldProcessNamespaces:NO];
  5. [parserparse];//开始解析

2、委托方法

主要使用一下委托方法

  1. //发现元素开始符的处理函数(即报告元素的开始以及元素的属性
  2. -(void)parser:(NSXMLParser*)parser
  3.         didStartElement:(Nsstring*)elementName
  4.         namespaceURI:(Nsstring*)namespaceURI
  5.         qualifiedname:(Nsstring*)qName
  6.         attributes:(NSDictionary*)attributeDict
  7. //处理标签包含内容字符(报告元素的所有或部分内容
  8. -(void)parser:(NSXMLParser*)parserfoundCharacters:(Nsstring*)string
  9. //发现元素结束符的处理函数,保存元素各项目数据(即报告元素的结束标记
  10. -(void)parser:(NSXMLParser*)parser
  11.         didEndElement:(Nsstring*)elementName
  12.         namespaceURI:(Nsstring*)namespaceURI
  13.         qualifiedname:(Nsstring*)qName
  14. //报告解析的结束
  15. -(void)parserDidEndDocument:(NSXMLParser*)parser
  16. //报告不可恢复的解析错误
  17. -(void)paser:parserErrorOccured


执行[parser parse]后会依序执行:

1、didStartElement

2、foundCharacters

3、didEndElement

示例如下:

  1. -(void)parser:(NSXMLParser*)parserdidStartElement:(Nsstring*)elementNamenamespaceURI:(Nsstring*)namespaceURIqualifiedname:(Nsstring*)qNameattributes:(NSDictionary*)attributeDict{
  2. NSLog(@"xml_parserstart%@",elementName);
  3. if([elementNameisEqualToString:@"person"]){
  4. NSLog(@"xml_parserperson");
  5. if(personNameArrary==nil){
  6. personNameArrary=[[NSMutableArrayalloc]init];
  7. }
  8. }
  9. if(itemValue!=nil){
  10. itemValue=nil;
  11. }
  12. itemValue=[[NSMutableStringalloc]init];
  13. if([elementNameisEqualToString:@"phone"]){
  14. Nsstring*atr=[attributeDictvalueForKey:@"type"];
  15. NSLog(@"xml_parserphonetype:%@",atr);
  16. }
  17. }
  18. -(void)parser:(NSXMLParser*)parserfoundCharacters:(Nsstring*)string{
  19. NSLog(@"xml_parservalue:%@",string);
  20. [itemValueappendString:string];
  21. }
  22. -(void)parser:(NSXMLParser*)parserdidEndElement:(Nsstring*)elementNamenamespaceURI:(Nsstring*)namespaceURIqualifiedname:(Nsstring*)qName{
  23. NSLog(@"xml_parserend%@",elementName);
  24. if([elementNameisEqualToString:@"firstName"]){
  25. [personNameArraryaddobject:itemValue];
  26. }
  27. if([elementNameisEqualToString:@"person"]){
  28. NSLog(@"xml_parserpersonend");
  29. }
  30. }

NSXMLParser DEMO 下载

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类