|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)xml|天生xml一样平常情形下,我们只需一提到XML,年夜多半成绩城市会合到剖析XML和XML布局等方面。在这类手艺范畴,W3C提出了DOM和SAX标准用来剖析数据,Sun供应了JavaXMLPack,而Apache则推出了Xerces和Xalan。但是,几近没有甚么存眷的眼光投射到输入XML这一成绩下去。把JavaBeans和Swing组件酿成XML的项目倒有一些,但年夜多半情形下,开辟职员只不外但愿能用定制的格局输入数据布局,这个义务实在不难。
本文出格切磋了经由过程Java创立XML文档的一些办法。我会详细提到好几种用Java创立XML文档的计划。它们都各自具有分歧的长处,有些很复杂,有些则会依附于某些壮大的类库。上面我就从最复杂的办法提及。
利用StringBuffer类
最复杂、同时也是最经常使用的XML文档创立办法就是本人下手。你能够接纳StringBuffer类大概某些Writer类。其长处是你不必要用到其他库,并且也不必创立过剩的对象。但是,这一举动同时也带来了良多弱点。首当其冲的就是没法包管XML的格局准确性。字符在置进String对象的时分必需细心思索。你得出格当心XML实体的呈现,好比用<代替<等。清单A对此举例申明。
程序清单A的输入了局是:
<personname="JonSmith"age="21"/>
在这个复杂的例子里,假如人名很乖僻,好比Jon"TheCat"Smith,那末输入格局就出成绩了。这段代码在猎取名字的时分没有处置引号,了局输入的代码就成了上面如许子,明显这类暗示是毛病的:
<personname="Jon"TheCat"Smith"age="21"/>
在浏览源代码的时分很难跟踪埋没在Java内的XML。想反,这类开辟措施中约莫1半摆布的毛病都回结为没有关闭的标签和毛病的引号处置,简而言之就构成了有效的XML。
更了了和复杂的办法:DOM
第2个举措就是DOM,也就是所谓的文档对象形式(DocumentObjectModel)。在给定对象布局以后,你能够把它转换为某种格局的XML对象布局,然后输入了局。可用的布局范例良多,局限包含JakartaElementConstructionKit(ECS)项目标XML类到完整恪守DOM标准的剖析器等,好比Xerces,一般,版本越小输入XML的办法就越复杂。清单B就是一个接纳ECS的例子。
清单B提出了一种输入数据的简明举措。现实上,你能够把两个输入行兼并为一个,办法是把output办法附在新的XMLDocument以后。这是一种接纳ECS的有类语法形式,用起来便利之极。不外,这类办法不克不及很好地针对职员的岁数复制if-null回护。为了完成这类回护,你必需接纳清单C中的代码。
ECS体现出了好几种长处,你不用制止引号字符(")。你也不必要完整关闭标签,对象会为你做这些事情的,任何XML字符,好比<大概>都被<和>取代,ECS可谓最复杂的DOM办法。而用W3C的DOM、JDOM大概Dom4J来处置这类作风的代码则更加庞大一些,固然,W3C的DOM仍旧具有自力剖析的长处。
接纳ECS输入XML的弱点包含了对象所引出的成绩。你必需在写出内容之前创建对象。如许做在年夜多半情形下仍是不错的,可你在输入年夜型XML文件的时分则不但愿创建这类XML布局。一样的成绩对其他年夜多半DOM办法也存在。
比起复杂地接纳Writers大概StringBuffer类而言,ECS相称靠近于一种标志。它的体积对照年夜,但只要很小一部分才用来输入XML。最年夜的成绩是它的举动余地不年夜。它击败了其他同范例的计划,由于其他范例更年夜、更粗笨并且更庞大。
SAX
SAX(SimpleAPIforXML)能够替换DOM作风的XML剖析。它由一系列事务大概代码在剖析XML文件时所挪用的回调函数构成。在你把了局间接输入到Strings的情形下它其实不能派多年夜的用处。可是,它能够用在直接的、更加庞大的体例下。
输入Strings的代码能够取代输入SAX事务。这一招可比仅仅输入Strings要高多了,它能够到场到一个复杂的基类由其把SAX事务转换为XML。
让我们看看上面的例子,这个例子中利用了以下几个类:
•Person:营业对象,先前已举行了申明
•PersonInputSource:回收Person对象
•PersonXMLReader:晓得怎样把PersonInputSource转换为SAX事务
•XMLPrettyPrinter:把SAX事务转换为XML的ContentHandler
个中最主要的代码在PersonXMLReader内,如清单D所示。
清单D中的代码申明了Person对象是怎样被转换为一系列SAX事务的。但这可不是个最复杂的活。用SAX把Person转换为XML是经由过程清单E中的代码完成的。
接纳SAX明显让你把握了壮大的盘算才能,由于你能够在XML上附带SAX剖析器而没有接纳XMLPrettyPrinter。可是,在增添处置器的时分也会增添庞大性;SAX是一种更庞大的观点。在多半情形下,复杂的办法常常效果最好。
一旦基础组件编写出来(XMLPrettyPrinter是一个基础InputSource,一个XMLParser对象),发生事务就是大事一桩了。输入新的XML布局只必要parse办法和拔出组件便可。
环绕SAX事务创建XML还不是一个快速、便当的措施。
接纳XmlWriter类
最初我提出个本人的计划,这就是XmlWriter类。我的思绪是接纳一种界于太复杂和太庞大之间的手艺来输入XML。
主要的计划需求以下:
•封装java.io.Writer
•供应Writer类的API
•尽量地处置XML
•制止创建年夜型对象布局
•同意ECS链式作风
完成以上的这些需求可让XML写成两种作风。起首,它能够用java.lang.Writer代码写出来,如清单F所示。
其次,它能够用链式办法的编码作风写成,这倒和ECS相似,由于每一个write办法都前往XmlWriter本身。清单G给出了如许的例子。
从功能角度上看,XmlWriter具有必定的明显上风,它几近没有创立其他对象。具有相称的功效性,能够处置基础的XML片断(但没有正文、缩排大概文档范例)。最主要的是,用起来很复杂。
其负面成绩已提到过了,它不克不及处置正文、缩排大概文档范例。而ECS在XML对象写出本身时能够关闭标签,XmlWriter必要你挪用endEntity办法。假如实体没有停止就挪用该办法就会扔出XmlWritingException。最初,另有一个close办法。它其实不关闭writer对象,但会完成任何编写中的XML。也许最主要的是,它会在实体没有停止的情形下扔出XmlWritingException。
小结
发生XML办法有好几种办法。XmlWriter其实不必定是最好的XML创立工具,可是这类办法弥补了太复杂、太粗笨以致太庞大之间的鸿沟。
轮性能微软曾做过一个例子,就是同一个项目用java和.net来作,结果开发周期,.net是java的一半,性能java是.net的十分之一,代码量java是.net的三倍。呵呵,这说明了什么,.net的全方位比java好。但是有的人说.net不能跨平台,这个问题我和我同学曾讨论过,都认为微软的.net很可能早都可以跨平台了,但是微软为了保护他们的操作系统,所以才没有推出跨平台的.net,只是推出了跨语言的.net, |
|