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 ...
随机推荐
- kcon 黑客大会 github
https://github.com/knownsec/KCon https://paper.seebug.org/107/ CISP认证 https://habo.qq.com/ https://g ...
- Revit Family API 添加类型
FamilyManager.NewType("");添加新类型,然后设置参数,就是为新类型设置参数. [TransactionAttribute(Autodesk.Revit.At ...
- Snmp学习总结(二)——WinXP安装和配置SNMP
一.安装SNMP 今天讲解一下在XP下安装SNMP协议,安装步骤如下:
- ASP.NET Web API中通过ETag实现缓存
通常情况下Server是无状态的,在ASP.NET Web API中,我们可以让服务端响应体中产生ETag属性,起到缓存的作用.大致实现原理是: 1.服务端的响应体中返回一个ETag属性2.客户端通过 ...
- Android Initializing a Build Environment
from://https://source.android.com/source/initializing.html#next-download-the-source Initializing a B ...
- 常见排序的JAVA实现和性能测试
五种常见的排序算法实现 算法描述 1.插入排序 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重 ...
- 超人前传第一至十季/全集Smallville迅雷下载
超人前传 第一至十季 Smallville Season 1-10 (2001-2010)本季看点:CW台的长寿剧<超人前传>在以帅哥靓女征服观众了这么多年后,也终于进入尾声,该剧将于今年 ...
- Spring MVC+Mybatis 多数据源配置
文章来自:https://www.jianshu.com/p/fddcc1a6b2d8 1. 继承AbstractRoutingDataSource AbstractRoutingDataSource ...
- C# 关键字Event
1>>> 在委托实例前,不加event,那这个委托就是一个普通的委托,我们可以用别的函数调用,也可以直接用对象调用,但加上关键字之后,只能用成员函数调用 public delegat ...
- 使用kubectl创建部署
本文使用自己利用VirtubalBox搭建的集群环境,暂时只有一个Master.一个Node.如果想了解集群的搭建,可以参考我的文章离线环境安装Kubernetes集群以及使用kubeadm安装kub ...