HTTP 响应实体主体:XML 及 XML parser

时间:2023-02-12 12:43:04

本文内容

  • 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