加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml结构解释、数据解析

发布时间:2020-12-15 22:56:42 所属栏目:百科 来源:网络整理
导读:一、xml结构介绍 1 XML 的声明 ? xmlversion=”1.0”standalone=”yes”encoding=”UTF-8” ? 这是一个 XML 处理指令。处理指令以 ? 开始,以 ? 结束。 ? 后的第一个单词是指令名,如 xml, 代表 XML 声明。 version,standalone,encoding 是三个特性,特性是

一、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 运行解析器

[cpp] view plain copy print ?
  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、委托方法

主要使用一下委托方法:

[cpp] view plain copy print ?
  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

示例如下:

[cpp] view plain copy print ?
  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 下载

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读