电脑综合技术区
400万+工程师在用
华为|鸿蒙开发者日
直播报名
400万+工程师在用
华为|鸿蒙开发者日
直播报名

电子发烧友网工程师

17年用户 16436经验值
擅长:可编程逻辑 MEMS/传感技术 测量仪表 模拟技术 控制/MCU RF/无线
私信 关注

sax是什么意思,什么是SAX?

2008-10-7 13:37

<p><font face="Verdana"><strong>sax是什么意思,什么是SAX?</strong></font><br/></p><font face="Verdana">
<p><br/>SAX,全称Simple API for XML,既是指一种接口,也是指一个软件包。SAX最初是由David Megginson采用Java语言开发,之后SAX很快在Java开发者中流行起来。San现在负责管理其原始API的开发工作,这是一种公开的、开放源代码软件。不同于其他大多数XML标准的是,SAX没有语言开发商必须遵守的标准SAX参考版本。因此,SAX的不同实现可能采用区别很大的接口。</font></p>
<p><font face="Verdana">作为接口,SAX是事件驱动型XML解析的一个标准接口(standard inteRFace)不会改变,已被OASIS(Organization for the Advancement of Structured Information Standards)所采纳。作为软件包,SAX最早的开发始于1997年12月,由一些在互联网上分散的程序员合作进行。后来,参与开发的程序员越来越多,组成了互联网上的XML-DEV社区。五个月以后,1998年5月,SAX 1.0版由XML-DEV正式发布。目前,最新的版本是SAX 2.0。2.0版本在多处与1.0版本不兼容,包括一些类和方法的名字。</font></p><font face="Verdana"><strong>
<p><br/>SAX的原理 <br/></strong>SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。<br/>大多数SAX实现都会产生以下类型的事件:<br/>在文档的开始和结束时触发文档处理事件。 <br/>在文档内每一XML元素接受解析的前后触发元素事件。 <br/>任何元数据通常都由单独的事件交付。 <br/>在处理文档的DTD或Schema时产生DTD或Schema事件。 <br/>产生错误事件用来通知主机应用程序解析错误。 </font><font face="Verdana"><br/></p><strong>
<p><br/>S</strong></font><font face="Verdana"><strong>AX的优缺点 </strong><br/></p></font><font face="Verdana"></font>
<p><font face="Verdana">&nbsp;</p></font><font face="Verdana"><strong>
<p><br/>SAX的常用接口介绍 </strong><br/>&nbsp;&nbsp; ContentHandler接口 <br/>ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。 <br/>ContentHandler接口的方法有以下几种: <br/>void startDocument() <br/>void endDocument()<br/>void startElement(String uri, String localName, String qName, Attributes atts) <br/>void endElement(String uri, String localName, String qName) <br/>void characters(char[ ] ch, int start, int length) </font></p><font face="Verdana"><strong>
<p><br/>DTDHandler接口 </strong><br/>DTDHandler用于接收基本的DTD相关事件的通知。该接口位于org.xml.sax包中。此接口仅包括DTD事件的注释和未解析的实体声明部分。SAX解析器可按任何顺序报告这些事件,而不管声明注释和未解析实体时所采用的顺序;但是,必须在文档处理程序的startDocument()事件之后,在第一个startElement()事件之前报告所有的DTD事件。 <br/>DTDHandler接口包括以下两个方法<br/>void startDocumevoid notationDecl(String name, String publicId, String systemId) nt() <br/>void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) </font></p><font face="Verdana"><strong>
<p><br/>EntityResolver接口</strong> <br/>EntityResolver接口是用于解析实体的基本接口,该接口位于org.xml.sax包中。 <br/>该接口只有一个方法,如下: <br/>public InputSource resolveEntity(String publicId, String systemId) <br/>解析器将在打开任何外部实体前调用此方法。此类实体包括在DTD内引用的外部DTD子集和外部参数实体和在文档元素内引用的外部通用实体等。如果SAX应用程序需要实现自定义处理外部实体,则必须实现此接口。 </font></p><font face="Verdana"><strong>
<p><br/>ErrorHandler接口 </strong><br/>ErrorHandler接口是SAX错误处理程序的基本接口。如果SAX应用程序需要实现自定义的错误处理,则它必须实现此接口,然后解析器将通过此接口报告所有的错误和警告。 <br/>该接口的方法如下: <br/>void error(SAXParseException exception) <br/>void fatalError(SAXParseException exception) <br/>void warning(SAXParseException exception) </font></p><font face="Verdana"><strong>
<p><br/>创建SAX解析器</strong><br/>(1)用系统默认值来创建一个XMLReader(解析器): <br/>XMLReader reader = XMLReaderFactory.createXMLReader(); <br/>(2)从给定的类名称来创建一个XMLReader :<br/>XMLReader reader = XMLReaderFactory.createXMLReader(<br/>"org.apache.xerces.parsers.SAXParser");<br/>(3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建: <br/>SAXParserFactory spFactory = SAXParserFactory.newInstance();<br/>SAXParser sParser = spFactory.newSAXParser(); </font></p><font face="Verdana"><strong>
<p><br/>DefaultHandler类 </strong><br/>DefaultHandler类是SAX2事件处理程序的默认基类。它继承了EntityResolver、DTDHandler、ContentHandler和ErrorHandler这四个接口。包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法。如下:<br/>import org.xml.sax.*;<br/>import org.xml.sax.helpers.DefaultHandler;<br/>public class TestDefaultHandler extends DefaultHandler{<br/>&nbsp;public void startDocument() throws SAXException{<br/>&nbsp;&nbsp;System.out.println("开始解析!");&nbsp;}<br/>&nbsp;public void endDocument() throws SAXException{<br/>&nbsp;&nbsp;System.out.println("解析完成!");&nbsp;}<br/>&nbsp;public void startElement(String uri, String localName, String qName, <br/>&nbsp;&nbsp;&nbsp;Attributes atts) throws SAXException {<br/>&nbsp;&nbsp;System.out.println("元素名:"+qName);<br/>&nbsp;}<br/>&nbsp;public void endElement(String uri, String localName, String qName) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws SAXException{<br/>&nbsp;&nbsp;System.out.println("对"+qName+"的解析完成!");<br/>&nbsp;}<br/>}</font></p>
<p><font face="Verdana"><strong>XMLReader接口 </strong><br/>XMLReader接口是使用回调读取XML文档的接口。XMLReader是XML解析器的SAX2驱动程序必须实现的接口。此接口允许应用程序设置和查询解析器中的功能和属性,注册文档的事件处理程序,以及对文档的解析。如下:<br/>import org.xml.sax.*;<br/>import org.xml.sax.helpers.*;<br/>public class TestXMLReader{<br/>&nbsp;public TestXMLReader(){<br/>&nbsp;&nbsp;try{<br/>&nbsp;&nbsp;&nbsp;XMLReader reader = XMLReaderFactory.createXMLReader(<br/>&nbsp;&nbsp;&nbsp;&nbsp;"org.apache.xerces.parsers.SAXParser");<br/>&nbsp;&nbsp;&nbsp;System.out.println("创建解析器成功!");<br/>&nbsp;&nbsp;&nbsp;//MyContentHandler是实现了ContentHandler接口的类<br/>&nbsp;&nbsp;&nbsp;reader.setContentHandler(new MyContentHandler());<br/>&nbsp;&nbsp;&nbsp;reader.setDTDHandler(new MyDTDHandler());<br/>&nbsp;&nbsp;&nbsp;//对test.xml进行解析<br/>&nbsp;&nbsp;&nbsp;reader.parse("test.xml");<br/>&nbsp;&nbsp;&nbsp;System.out.println("解析完成!");<br/>&nbsp;&nbsp;}catch(SAXException e){e.printStackTrace();}<br/>&nbsp;}<br/>}<br/></font></p>
<p><font face="Verdana"><strong>SAX的另外一个含义:</strong><br/></font><font face="Verdana"><strong>sax也就是萨克斯</strong><br/>下面,给喜欢萨克斯管的朋友们聊聊这个神奇的乐器诞生的故事。<br/><br/>在管乐大家庭里,很多都是有着上千年历史的古老的乐器(长笛、小号、圆号等等),根本无从考证他们的发明者;而萨克斯管距今只有不到两百岁的年纪,可以说是管乐器里的年轻人,并且,萨克斯管是有着全世界一致公认的发明人——阿道夫.萨克斯(Adolphe Antoine Sax),这个伟大的发明家拥有发明萨克斯管的专利权。<br/><br/>阿道夫.萨克斯1814年出生于比利时的小城-迪南。他的父亲当时是一位较有名望的乐器制造商。阿道夫.萨克斯在15岁的时候已是布鲁赛乐音乐学院的一名优秀生,并且和布鲁赛乐交响乐团合作演出。他在长笛和单簧管方面已有相当的造诣,也正是由于他将单簧管加以改进,才使得单簧管成为交响乐中的标准成员。比利时政府对此大加鼓励,在一个展览会上授予他二等奖,但阿道夫.萨克斯为自己没能取得一等奖而感到有些扫兴,失望之余,赴巴黎发展。 <br/>1842年,阿道夫.萨克斯发明了第一支萨克斯,是一支上低音降E调萨克斯。这支乐器的发明给阿道夫.萨克斯的好朋友柏辽兹留下了深刻的印象。柏辽兹是当时欧洲最具影响力的音乐家之一,他在各种媒体上对阿道夫.萨克斯发明的这种乐器大加赞赏,说这种乐器最具有人性的特点。人们便根据阿道夫.萨克斯的姓来给乐器命名——"萨克斯",一种音色最为美妙、造型最具特点的乐器就这样诞生了。<br/>1844年,萨克斯管的第一次使用是在乔治.凯恩特纳的歌剧《最后的犹太王》中,柏辽兹也为萨克斯创作了一部合奏曲《圣歌》。<br/>1846年,阿道夫.萨克斯发明的萨克斯获得了乐器的专利。这奠定了他在巴黎音乐界的显赫地位,被誉为欧洲的天才。而后阿道夫.萨克斯在巴黎开办了一家萨克斯制造企业。阿道夫.萨克斯一共发明了14种大小不同、形状各异的萨克斯。(包括小型的小高音萨克斯和大型的倍低音萨克斯,倍低音萨克斯的喇叭口非常大,甚至可以放入一个小孩。) <br/>1851年,阿道夫.萨克斯取得了一项孔距为二十四键金属大管的专利权,此种金属大管被称为"萨克斯体系大管"。<br/>1853年,法国的军乐队率先开始启用萨克斯管,使木管乐与铜管乐完美的结合起来。在他们的影响下,当时欧洲所有国家的管乐队都来购买阿道夫.萨克斯发明并生产的这种乐器,这使得阿道夫.萨克斯成为当时非常富有的人。阿道夫.萨克斯的成功引起了同行的嫉妒,于是便将他告上法庭,说阿道夫.萨克斯窃取了他们的专利,阿道夫.萨克斯为了维护自己的发明和荣誉进行了英勇的斗争。<br/>1885年,法国赛尔玛管乐器制造公司在巴黎成立,该公司根据创始人亨利.塞尔玛(Henri Selmer)的名字命名。塞尔玛乐器制造公司主要生产单簧乐器,尤其是萨克斯和单簧管,其卓越而优秀的产品质量闻名于世。<br/>1887年,阿道夫.萨克斯在萨克斯原来的最低音"B"键下,又增加了一个降"B"键,并且在几个最低音且较大的键子上,加装上了保护键的半框架装置。<br/>1894年,已身无分文的阿道夫.萨克斯在巴黎过世,不过可以告慰他的在天之灵的是,经过他的律师多年的努力,最终打赢了他和对手的官司。<br/><br/>虽然阿道夫.萨克斯一生中大部分的时间是在法国度过,但是比利时的人们永远不会忘记他,记得2000年出访比利时的时候,就发现在他们的两元钱的纸币上赫然印着阿道夫.萨克斯的头像和他发明的萨克斯管,足以说明阿道夫.萨克斯在比利时人们心目中的地位。在阿道夫.萨克斯去世后的一百多年的时间里,萨克斯管虽然也不断的有新的改进(增加高音#F键等等),但主体结构和基本技术没有改变过,这更加说明阿道夫.萨克斯是一个乐器史上的天才巨匠。</p></font>
[此贴子已经被作者于2008-10-7 13:40:05编辑过]
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

更多回帖

打开APP