本文内容

  • 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的更多相关文章

  1. Power Designer导出实体类和NHibernate xml文件

    Power Designer导出实体类和NHibernate xml文件 今天研究了一下通过PowerDesigner生成实体类和NHibernate所需要的xml文件,方法是通过Power Desi ...

  2. 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来 ...

  3. XML 参考:XML基础 XML 简介

    XML 参考:XML基础 -- XML简介和用途 转:http://www.cnblogs.com/Dlonghow/archive/2009/01/22/1379799.html XML 参考:XM ...

  4. Struts2中有关struts-default.xml,struts.xml,struts.properties文件详解

    1) struts-default.xml 这个文件是struts2框架默认加载的配置文件.它定义struts2一些核心的bean和拦截器. <?xml version="1.0&qu ...

  5. XML.ObjTree -- XML source code from/to JavaScript object like E4X

    转载于:http://www.kawa.net/works/js/xml/objtree-try-e.html // ========================================= ...

  6. 使用LINQ TO XML 创建xml文档,以及读取xml文档把内容显示到GridView例子

    首先,准备了一个Model类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  7. 【XML】 XML格式一些记录

    XML XML格式常用于网络通讯,本身不会有作为而是作为纯文本传输,可以说它是一种独立于应用和硬件的数据传输工具.虽然看起来XML比HTML要更加简单,也知道的更加晚一点,但是需要知道的是,XML才是 ...

  8. Linq To Xml操作XML增删改查

    对XML文件的操作在平时项目中经常要运用到,比如用于存放一些配置相关的内容:本文将简单运用Linq TO Xml对XML进行操作,主要讲解对XML的创建.加载.增加.查询.修改以及删除:重点在于类XD ...

  9. Java SE之XML<一>XML文档规约

    [文档整理系列] Java SE之XML<一>XML文档规约 1.xml文档引用: 1.外部私有DTD: <!DOCTYPE rootNodeName SYSTEM "ur ...

随机推荐

  1. DbContextScope,A simple and flexible way to manage your Entity Framework DbContext instances,by mehdime

    DbContextScope A simple and flexible way to manage your Entity Framework DbContext instances. DbCont ...

  2. 论DELPHI三层的数据序列格式的变化

    论DELPHI三层的数据序列格式的变化 要窥三层的数据序列格式,我们可以通过观察DELPHI官方的客户端内存表. 早先流行的是TClientDataSet,它的Data和Delta属性的数据类型都是: ...

  3. 【CentOS】centos如何修改你的主机名

    转载地址:https://www.linuxidc.com/Linux/2014-11/109238.htm ============================================= ...

  4. Codeforces 394D Physical Education and Buns 胡搞

    题目链接:点击打开链接 题意:给定n个数的序列(能够排序) 操作一次能够使得某个数++或--. 问最少操作几次使得序列变成一个等差序列 输出: 第一行输出最少操作的次数 第二行输出等差数列里的最小项 ...

  5. Reflector_8.3.0.93_安装文件及破解工具

    Reflector_8.3.0.93_安装文件及破解工具 下载地址:http://pan.baidu.com/s/1jGwsYYM   约 8.9MB

  6. 行尸走肉第一季/全集The Walking Dead迅雷下载

    本季The Walking Dead 1 第一季(2010)看点:<行尸走肉>讲述了警察瑞克在一次执法行动中因中弹负伤而不省人事,当他从昏迷中苏醒后却惊讶地发现,这个世界已然天翻地覆.周遭 ...

  7. centos升级到最新的mysql

    去站点下载mysql的yum源.地址例如以下: http://repo.mysql.com/ 在linux上先查看系统的版本,依据版本相应下载 more /etc/redhat-release rpm ...

  8. mongodb分布式集群搭建手记

    一.架构简介 目标单机搭建mongodb分布式集群(副本集 + 分片集群),演示mongodb分布式集群的安装部署.简单操作. 说明在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PSS( ...

  9. Cannot find snapshot in models/VGGNet/VOC0712/SSD_300x300

    错误描述: 执行 python examples/ssd/ssd_pascal.py 报错: Cannot find snapshot in models/VGGNet/VOC0712/SSD_300 ...

  10. [转]RSA,DSA等加解密算法介绍

    From : http://blog.sina.com.cn/s/blog_a9303fd90101cgw4.html 1)      MD5/SHA MessageDigest是一个数据的数字指纹. ...