HTTP 响应实体主体:XML 及 XML parser
本文内容
- HTTP 响应实体主体:XML
- XML parser
- 总结
- 各编程语言实现的 XML parser
HTTP 响应实体主体:XML
实体主体(entity-body)通常是HTTP响应里最重要的部分。就 Web 服务而言,实体主体通常是一个 XML 文档,其中包含客户端所需的大部分信息。这些信息,在经过 XML parser 解析后,便可为客户端所用。
在得到 URI,一组报头和一个主体文档后,然后用 HTTP 库把这些数据变成 HTTP 请求,并发给服务器,接着用 XML 解析器把 HTTP 响应解析为一个数据结构或一系列事件。我们按照服务的要求发出请求,至于服务返回的响应数据,可以按自己意愿任意使用。
虽然大多数 Web 服务返回的都是 XML 文档,不过也逐渐有 Web 服务返回序列化为 JSON 字符串的简单数据结构。JSON 通常是供 Ajax 应用的客户端部分使用的。其想法是:浏览器从 JSON 数据结构得到 JavaScript 数据结构,要比从 XML 文档得到 JavaScript 数据结构容易得多。JSON 提供一种轻量级的序列化数据的方案,以作为基于 XML 的方案的补充。
XML parser
XML parser 可分为三种、两种基本的 XML 解析策略:基于文档的(document-based)策略和基于事件的(event-based)策略。基于文档的策略,如 DOM 等树式解析器;基于事件的策略,如 SAX 以及"拖"式(pull)解析器。
基于文档的树式策略,是三种中最简单的。树式解析器把 XML 文档建模为一种嵌套的数据结构。这种数据结构一旦生成好,你就可以用 XPath 查询、CSS 选择器(selector)等来查询和处理它。DOM 解析器是一种树式解析器,它实现了一个 W3C 定义的接口。树式策略的优点在于使用简单。可最大的缺点是:你必须把整个文档作为整体来处理。也就是说,你必须在把整个文档完全转换为树结构后才能处理它——这需要把整个文档载入内存,可想而知,如果是大文档,即使结构简单,那这种方式也很低效。要是能"解析一点,处理一点"就好了……
SAX 式或拖式(pull)解析器把一个 XML 文档转换成一个事件表,而不是数据结构。开始标签(starting tag)、结束标签(closing tag)、XML 注释(comments)以及实体声明(entity declaration)等都是事件(event)。
拖式解析器(pull parser)。假如几乎每个事件你都要处理,那 pull parser 将很有用。Pull parser 允许你一次处理一个事件,即:如果需要,就从事件流里"拖出(pull)"下一个事件。你可以对"拖出"的事件做相应处理,也可以用它构建一个数据结构(多半要比树式的数据结构要小)供以后使用,你可以在任何时候暂停解析文档,等需要继续时,再从事件流里"拖出"下一个事件。
SAX 解析器(SAX parser)更为复杂,但它在你只关心部分事件时很有用。你可以向 SAX parser 注册一些回调方法。一旦定义好回调方法,解析器将按照既定的、跟文档无关的步骤执行下去;解析器将把 XML 文档转换为一些系列事件,并接连处理文档中的每个事件,每当一个事件与回调方法所对应的事件相匹配,解析器就会触发该回调方法,执行你定义的代码,在回调方法执行结束后,SAX 解析器将接着继续处理事件序列。
总结
基于文档的解析器,优点是,你可以随机访问文档中的内容;而对于基于事件的解析器,事件触发后,就没有机会再次处理。如果想再次触发它,就得重新解析该文档。
而且,如果遇到格式有错误的 XML 文档,基于事件的解析器要直到处理到出错的地方才会报错和崩溃;因此,假使你不希望回调方法被格式有错误的文档锁触发,就必须在把 XML 文档交给基于事件的解析器处理前,确保该文档结构良好。
各编程语言实现的 XML parser
- Ruby:REXML
- Python:ElementTree 和 Beautiful Soup,以及 xml.sax 模块
- Java:javax.xml、Xerces 和 XML Pull
- C#:System.Xml.XmlReader
- PHP:xml_parser_create 函数、XMLReader、SimpleXML、DOMIT!
- JavaScript:responseXML
- ActionScript:XML.load
- C:Expat、libxml2
- C++:Xerces-C++
- Common Lisp:SXML
- Perl:XML::Xpath、XML::Simple、XML::SAX::PurePerl、XML::LibXML::Reader
HTTP 响应实体主体:XML 及 XML parser的更多相关文章
- Power Designer导出实体类和NHibernate xml文件
Power Designer导出实体类和NHibernate xml文件 今天研究了一下通过PowerDesigner生成实体类和NHibernate所需要的xml文件,方法是通过Power Desi ...
- XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...
- XML 参考:XML基础 XML 简介
XML 参考:XML基础 -- XML简介和用途 转:http://www.cnblogs.com/Dlonghow/archive/2009/01/22/1379799.html XML 参考:XM ...
- Struts2中有关struts-default.xml,struts.xml,struts.properties文件详解
1) struts-default.xml 这个文件是struts2框架默认加载的配置文件.它定义struts2一些核心的bean和拦截器. <?xml version="1.0&qu ...
- XML.ObjTree -- XML source code from/to JavaScript object like E4X
转载于:http://www.kawa.net/works/js/xml/objtree-try-e.html // ========================================= ...
- 使用LINQ TO XML 创建xml文档,以及读取xml文档把内容显示到GridView例子
首先,准备了一个Model类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- 【XML】 XML格式一些记录
XML XML格式常用于网络通讯,本身不会有作为而是作为纯文本传输,可以说它是一种独立于应用和硬件的数据传输工具.虽然看起来XML比HTML要更加简单,也知道的更加晚一点,但是需要知道的是,XML才是 ...
- Linq To Xml操作XML增删改查
对XML文件的操作在平时项目中经常要运用到,比如用于存放一些配置相关的内容:本文将简单运用Linq TO Xml对XML进行操作,主要讲解对XML的创建.加载.增加.查询.修改以及删除:重点在于类XD ...
- Java SE之XML<一>XML文档规约
[文档整理系列] Java SE之XML<一>XML文档规约 1.xml文档引用: 1.外部私有DTD: <!DOCTYPE rootNodeName SYSTEM "ur ...
随机推荐
- mysql函数的使用
最近总感觉sql语句不对劲,所以就看了一些官方文档发现了一些以前没有注意的函数:感觉在查询的时候可以用得上,毕竟是内置函数,用起来效率应该会好一些的: FIND_IN_SET(str,strlist) ...
- springboot线程池的使用和扩展(转)
springboot线程池的使用和扩展 我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行, ...
- android多设备界面适配的利器:属性weight的妙用
1.按比例显示控件元素 <EditText android:id="@+id/edit_message" android:layout_weight="2" ...
- SharePoint SPUtility.SendEmail 发送邮件设置级别
前言 熟悉sharepoint开发的都知道,sharepoint默认有个发送邮件的方法,不过,最近有个需求,用户希望发送邮件的时候,带上邮件的级别. 经过研究,发现有下面的办法,可以添加邮件的发送级别 ...
- C#泛型委托Predicate、Action、Func
Predicate Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素.通过查看源码发现 Pr ...
- Xcode打包踩过的那些坑
一.file was built for archive which is not the architecture being linked (armv7s) 项目是基于cocos2d-x绑定lua ...
- activity启动流程速记笔记
Activity.startActivity(Intent intent)----Activity.startActivityForResult(Intent intent)----Instrumen ...
- 详细解读Volley(三)—— ImageLoader & NetworkImageView
ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...
- 得到view坐标的各种方法
这篇文章讲的方法全是再控件可以获取焦点的情况下执行的,如果在oncreat()里面执行,那么得到的都是0 1.getLocationInWindow 这个方法得到的是view相对于当前Activity ...
- Java中的线程实现
线程实现有两种方法: 1.写一个类来继承Thread类,然后复写run()方法. public class HelloThread extends Thread { public void run() ...