`
MEclipse
  • 浏览: 900 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于一点XML的愚见

阅读更多
   我想说说我自己对XML这门语言的看法,从自己以前的学习过程中,XML感觉就像是上帝的一点光,总是会引领着IT技术的发展。
    XML是当今十大软件技术之一,它是一种数据交换模式,并且具有跨语言,跨平台的强大功能,通过它不同系统和不同程序之间可以进行无二性的交互数据,另外它还能作为一种层次型数据库进行使用,有效的保存数据,并且能够存储其数据关系,它是把数据和格式相互分离的一种先进技术。
    概念其实也不用多讲了,在当今IT流中,XML起着举足轻重的作用,用推动IT流的前进这句话来形容它其实一点也不过分。无论是在数据交换,内容管理,WEB应用,WEB集成等领域都有着一席之地。
    XML其实本身就是一个文本文件,很多人用它与RDBMS做比较,为什么XML如此的流行,是因为在数据库的使用当中,如果的对数据库进行直接操作,是由厂商自己所完成,每个厂商都不一样,所以是具有保密性,要想访问到对应的数据库,那么就得拥有对应厂商的驱动程序。而XML不一样,它只是一个文本文件,任何人都可以通过解析技术对它进行解析,所以从另外一方面来说,XML得益于另类开源这个词。可以这样说,全世界任何一门高级语言都可能会用到XML。总之,在XML中,存储小量数据,并且能够表示非常复杂的数据之间的关系。
    提到XML,可能很多人都会联想到相关的5个技术::校验技术,解析技术,查询技术,链接技术,转换和显示技术。这5个技术中校验和解析是由为重要的,先说一说XML的校验技术,对应的两种检验语言,DTD和XML Schema,随着时代的不断更新,目前来说DTD已经逐渐退出历史舞台了,取而代之的则是schema,但是我想说的是,如果把校验技术学的很好,那么就要必须得学好DTD,而不是把schema放在重点上,因为现在来说schema已经可以用软件工具自动生成代码了,实际开发是相当方便的。为什么要学习DTD呢,为什么要学习一个已经快要退出IT舞台的语言呢,其实内容很简单,在schema中很多地方其实是只有学习过DTD的人才能看的懂的,非常重要的一点则是schema和DTD出现的错误信息都是DTD格式的,如果没有DTD的基础,是不可能看懂这些错误信息的,那么出现错误之后将对调试毫无办法。
    DTD和schema其实都是约束XML文档的一种约束模式语言,而现在之所以schema更好,是因为他对XML文档的约束能力更加强大,更加的精确,定义的数据类型更加的丰富,如果两者之间进行比较的话,就我个人而言,觉得DTD才是关键,因为原始,所以根本,当然schema也是非常优秀的,只是要学习schema,个人觉得首先应该掌握好DTD。
    一个很明显的事实:通过驱动程序去访问数据库,而通过解析技术去访问XML,如何做到这些,太多太多的高手写过相关的太多太多的技术了。对于JAVA来说,从JAXP的DOM,SAX到JDOM,再到DOM4J,小小的文本文件拥有了大量的技术来对其进行解析。其实不要看XML文件只是一个文本,正因为他存储的数据关系复杂,所以对它的解析是比较困难的。解析其实就是读取文件,然后将文本文件分解成可以解析的元素的过程。SUN公司在早期定义的DOM接口和SAX接口,虽然因为复杂,我们已经基本不使用他们了,但是我们应该去了解一下他们背后的故事。
DOM是一种树状模型的API,通过这个API我们可以对XML文档进行解析,DOM解析的方式是:一次性的把XML读入到内存当中,然后进行解析,这种解析方式对定位节点是非常方便的,因为在内存中整个XML文档都已经存在,所以某个节点与其他节点之间的关系就是相当明确的,并且可以进行数据的修改,但是这种解析方式有明显的缺陷,就是不能解析大型的XML文档,当XML文档过大,那么就会造成内存泄漏,因为DOM太消耗内存了。
    另外一个则是SAX,它是simple API for XML的简称,从名字上来说,其实SUN公司是把它定义成一种更为简单的访问XML的方式,但是其实一点也没能得到简化,同样的与DOM一样是属于非常复杂的解析方式,不同于DOM,它的解析方式则是一种事件驱动模型,在这种模式当中,通过回调机制来通知节点的位置,这个解析方式是按顺序一步一步的来读取XML文档,然后进行解析的,优点则是可以读取较大型的XML文档,内存占用率小,但是仍然具有明显的缺陷:只能按顺序来进行解析XML,不能进行随机访问,这个是非常不方便的,也就是定位节点不方便,另外存在只读的功能,也就是说我们不能通过SAX来进行数据修改,并且在解析过程中,我们对XML文档的每个元素的遍历也只有一次。
    因为DOM和SAX对XML的解析步骤是相当复杂的,所以才有了JDOM这种新型的解析技术,随后又出现了优秀的解析XML文档的技术:DOM4J。对这两种技术我感触颇深,简单的来说JDOM是面向过程的,而DOM4J则是面向对象的,这样说其实很抽象,我们可以来看一看这个例子:
    这里有2个节点,A和B,用JDOM的方式是我们开发人员用自己 的方式把A+B拼接起来,然后再放入XML文档中,而其实放入到文档当中的这个步骤是我们开发人员来完成,也就是A+B+XML。
    如果用DOM4J来干这件事情的话,则是调用元素的ADD方法,来进行添加,这个ADD并不是我们自己去完成的,而是对象本身自己去完成的,怎么完成的其实我们并不知道,也就是A.add(B),xml.add(A),所以这是一种面向对象的解析方式。
  相关的XML的东西太多太多,而且非常复杂又充满了神奇的力量,个人认为,XML是IT流中的一朵奇葩,就算以后会被一种新的技术所取代,但是它留下的那些脚印,永远是不可磨灭的。这只是我个人的一些对XML的看法,仅次而已。

分享到:
评论
48 楼 hillshills 2009-06-25  

  XML?!

  老生常谈了......

  JDOM也有优点,不过XML4J的面向对象不错的。
47 楼 CodingMouse 2009-06-07  
任何技术的产生及推广都是在解决某一类特定问题的情况下产生的,JSON只是简化了XML的数据保存功能,但XML的数据结构展现却是JSON所不能比拟的。
46 楼 peteraml1 2009-05-07  
luolonghao 写道
尽量不用XML。
网络数据传输:JSON
配置文件:YAML


较喜欢用JSON,不喜欢用XML
45 楼 xingqiliudehuanghun 2009-05-05  
最招风的肯定是大树,有这么多人对xml有怨言,看来用的最多功能最强的就是xml了
44 楼 hax 2009-04-29  
cgwangjun 写道
写得真好! 精华贴也不过分。 XML 确实是未来的核心


已经成新手贴了。最后一下貌似是我投的。
43 楼 抛出异常的爱 2009-04-29  
1314520ln 写道
java的烂代码比较好懂一些吧.


怎么烂啊?
到是觉的.net也差不多啊

每天读大约200行以上的java烂代码.....情绪稳定
42 楼 cgwangjun 2009-04-29  
写得真好! 精华贴也不过分。 XML 确实是未来的核心
41 楼 1314520ln 2009-04-28  
java的烂代码比较好懂一些吧.


怎么烂啊?
到是觉的.net也差不多啊
40 楼 rocwon 2009-04-28  
json 代替 xml 是程序员战胜学院派的伟大胜利[/quot]
对某一个项目,某一段程序而言,你可以说XML笨重,效率低。。。等等缺点。
但对一个行业的标准化而言,XML的优势是独一无二的。
39 楼 lkjust08 2009-04-26  
xml是这个时代的新宠。
38 楼 calmness 2009-04-26  
我个人认为,不要把XML的复杂归为XML的错误,实际上正因为XML本身结构的复杂,也造就了它能够很好的表达复杂的结构,json之流是很简单,对于简单的数据结构就应该使用json,但是如果涉及到复杂的业务模型,json就力不从心了,别不信,你用json来描述一个复杂的业务流程看看?保证吐血。所以具体使用哪种方式,看需求而定。
37 楼 icefishc 2009-04-24  
mikeandmore 写道
kimmking 写道
json 代替 xml ??? 搞笑,
过去没有,现在没有,将来也没有。

json的描述能力还是太差了,但因此而简洁,js天生支持,所以某些场合代替了xml,
比如绝大部分的ajax中的x。

反观xml呢?已经可以应用到目前几乎全部的开发语言和领域。
但是,光荣属于SGML。

什么时候你才需要那么复杂的表述呢?

至少我认为没有必要把很多配置文件弄成xml的。
我的意思不是xml sucks,而是xml被过渡的使用了。

很多场合不是xml该用的地方。


嗯 赞同。XML有时被过度使用了。
36 楼 icefishc 2009-04-24  
mikeandmore 写道
icefishc 写道


不要轻易对自己不了解的东西的东西做评价。
??口碑极差?? 这是从哪听来的。

我选择用XML多半是因为想用XSLT XPath XML schema 这些东西.或者现有的系统需要用XML.
否则更倾向于用YAML.

lisper是这样的。
就是每天都在夸耀lisp非常非常强大(实际就是很强大),
然后遭到很多不明细节的群众围观。
然后被人认为是自夸自大。
于是lisp的口碑也从此变差了。。。。嗯

这和lisp的设计实现没关系。和lisp的宣传方式有关系。。。。

比如,我在这里发帖说“lisp完全可以替代java成为软件开发的骨干”肯定会被喷一样。。。。。。


呵呵, 可能有些人是这样的. 大多数没有那么极端.
我平是也会写些lisp的程序。 但我从来没有认为lisp会成为软件开发的骨干.
我身边学习lisp的人基本也持有相同的观点。  我们学习Lisp为的是学习编成思想。 仅此而已。
35 楼 不吃鱼的猫 2009-04-24  
xml的好处是适合机器读,缺点是不适合人读
34 楼 Xorcerer 2009-04-24  
抛出异常的爱 写道
UlsterBoy 写道
Durian 写道
json 代替 xml 是程序员战胜学院派的伟大胜利

JSON 能取代xml 么? 我很怀疑

xml强大之处在于设计时把人的感受作为一个考虑因素.


支持这个,虽然对于程序来说,它很啰嗦。
33 楼 抛出异常的爱 2009-04-24  
uda1341 写道
补充说明:

XML目前的困境在于:

面对越来越复杂的数据和关系,XML必须发展出越来越复杂的规范,定义出越来越复杂的文件,越来越向语言靠拢,在这个方向上,XML有甩不掉的历史包袱,面临极大的限制。

而在规范和解析器都日益变得庞大的进化过程中,XML在一些简单的特定领域又逐渐失去了简单灵活的优势。

正则式风格 文言文 加图片 手绘编程 才素王道 .....
听着像VS6
32 楼 uda1341 2009-04-24  
补充说明:

XML目前的困境在于:

面对越来越复杂的数据和关系,XML必须发展出越来越复杂的规范,定义出越来越复杂的文件,越来越向语言靠拢,在这个方向上,XML有甩不掉的历史包袱,面临极大的限制。

而在规范和解析器都日益变得庞大的进化过程中,XML在一些简单的特定领域又逐渐失去了简单灵活的优势。
31 楼 uda1341 2009-04-24  
XML是越来越难懂了,原因在于越来越多的信息被附加在XML上。

对于复杂关系的表达,树状结构已经不堪重负。用XML定义一切的企图,只是不切实际的幻想。

很多的概念,似乎看起来都可以用XML来表达,但实际做起来,处理上为什么会这么繁杂?

原因在于树状结构本身,它只是一种数据存储的层次结构,其能力并不足以说明大量复杂的概念,但开始我们为什么会有这种错觉呢?XML能存储数据没错,但概念上的联系,却有一部分被迫包含在了对XML的处理代码中。也就是说,一个XML文件所包含的信息是不完全的,还必须依赖于特定的处理代码,才能够展现出我们所要表达的所有概念。这一部分概念在XML文件中的缺失,为对XML的处理增加了很多不必要的麻烦。

前面有人说到LISP,其实,最合适的,莫过于Prolog了,通过为Prolog定义一个子语言,我们可以发现,现有的XML规范可以变得非常的清晰,易懂。

假如用一段PROLOG代码来替换一个XML文件,我们面对的就不是一个静态的层次结构,还要自己做诸多处理才能满足要求,我们所面对的是一个可以进行各种查询的智能数据库,可以向其提出各种问题,得到所需要的答案,处理过程变得非常简单和纯粹,其真正的原因在于,这些数据和数据之间的关系,在prolog代码中已经完整得到了表达。处理过程所需要做的,就是向这段代码提出问题,并得到答案。
30 楼 mikeandmore 2009-04-24  
kimmking 写道
json 代替 xml ??? 搞笑,
过去没有,现在没有,将来也没有。

json的描述能力还是太差了,但因此而简洁,js天生支持,所以某些场合代替了xml,
比如绝大部分的ajax中的x。

反观xml呢?已经可以应用到目前几乎全部的开发语言和领域。
但是,光荣属于SGML。

什么时候你才需要那么复杂的表述呢?

至少我认为没有必要把很多配置文件弄成xml的。
我的意思不是xml sucks,而是xml被过渡的使用了。

很多场合不是xml该用的地方。
29 楼 mikeandmore 2009-04-24  
icefishc 写道


不要轻易对自己不了解的东西的东西做评价。
??口碑极差?? 这是从哪听来的。

我选择用XML多半是因为想用XSLT XPath XML schema 这些东西.或者现有的系统需要用XML.
否则更倾向于用YAML.

lisper是这样的。
就是每天都在夸耀lisp非常非常强大(实际就是很强大),
然后遭到很多不明细节的群众围观。
然后被人认为是自夸自大。
于是lisp的口碑也从此变差了。。。。嗯

这和lisp的设计实现没关系。和lisp的宣传方式有关系。。。。

比如,我在这里发帖说“lisp完全可以替代java成为软件开发的骨干”肯定会被喷一样。。。。。。

相关推荐

Global site tag (gtag.js) - Google Analytics