开发者学堂课程【高校精品课-上海交通大学 -互联网应用开发技术:HTML&CSS 3】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/76/detail/15741
HTML&CSS 3
内容介绍:
一、Introducing XML
二、Parsing an XML Document -DOM
三、Parsing an XML Document -SAX
四、Parsing an XML Document -STAX
五、Locating Information with XPath
六、XQuery
七、XML Transformations
一、Introducing XML
XML和刚才的HTML很像,它都是一种标记性语言。然后他描述的方式,在很多文件里面,你想表示键值对的配置的时候,你可能都会这么写()。但是XML他会用层次型的方式来表述这些数据,那么像这种window的宽度,你用400、200,中间加个空格来表示这种方式它就容易出错,就是用这种键值对的方式表示容易出错,但是用XML的方式来说就不容易出错。那所以我们用XML的方式来表示,就是这样。
那你用标签来唯一的描述。这个数据它的含义是什么?然后在这里面要注意的是。XMl比HTML严格,比如说我刚才说的那些资料里面,如果XML只写P。那么你后面写什么,最后这个结束标签可以没有。如果没有的话,你也不会出任何的错,但是如果要是说在 XML里面,你如果没有这个+〈/name〉,它就会出错,所以XML是一个格式要求非常严格的一个东西。那么XML是一种写字的方式,必须是这种层次型的,XML甚至可以拿来当数据库去使用,这种数据库叫做层次型数据库。然后XML是用这种标签来写。
讲讲XML的结构,一开始是必须要这一行,就在表示它的版本号和它的编码机制,类似于HTML里面的那个表头表示的信息。然后还有一个问题,XML到底是应该是比如说H1的标签底下套一个HR,还是H2套H1,也就是说它的格式是有约定的,
约定的格式有两种方法,一种叫做用dtd的方法。还有一种叫做用schema的方法。就是你在告诉别人家XML不能随便乱写,必须是他的格式的,dtd是一个专门的语言,而schema是用XML写的,dtd用一种专门的格式来描述,比如说必须是〈font〉,里面不能包含〈name〉〈size〉,可能是〈name〉包含〈size〉,但是是使用自己的语言,schema使用本身来描述,XML必须要层次的描述,在解析的时候,要明白XML解析的意思,如果给你一个XML文件,你知不知道首先它符合不符合他一开始说的那种dtd格式,其次里面的内容都是什么,比如说。刚才我们看到的这个内容〈name〉,这个标签里的内容是什么,这是解析要做的事情,生成按照指定格式组装出来的XML文件,
二、Parsing an XML Document -DOM
解析的时候有两种方法,一种叫做DOM,就是获得整个文件的model,这个model就是它的编程模式就是把这个文件的dom builder进行parse,它就会在内存里生成一个树,层次型的结构实际上是可以描述成一棵树,这棵树里面将来你就可以去遍历这个数,得到每个节点内容,节点的值是什么,所以在解析的时候可以是个文件,也可以是个网络流,节点分为很多种,这是dom里面,类的结构,可以得到节点的属性、类型等等,举个例子,刚才看到的xml的一个例子在解析的时候,首先在〈font〉和〈name〉之间是有空格的,〈name〉和〈size〉之间的空白字符,空白字符包括空格、tab键、回车键,然后又碰到〈size〉这个元素,后面又是一个空白字符,因为要换行,这些数据建出dom,
就是这个DOM底下有一个〈font〉这个元素,〈font〉有一个空白,然后〈name〉,然后空白,然后〈size〉,然后最后空白,〈name〉会有具体的值text,就是Helvetica,同理〈size〉也有一个值36,这个DOM解析工具在调用了这个方法之后,会对这个XML的内存文件里面构成一棵树,剩下的去遍历,得到你想要的,比如你可以遍历所有的儿子,每个儿子你拿出来都是一个节点,检查是不是元素,因为有可能是空白字符,只关心element,不关心其他的,再判断element是不是name,如果是,就取它的text,这就是遍历的过程,DOM的解析过程就是把XML建成一个树,建成树,再去遍历所有节点,所以DOM的逻辑就是先建立树再去遍历,所以XML文件很大的话,就建这个树的过程非常耗资源,速度会非常慢,但是一旦建好它在内存里,那所以它的速度就会非常快,就是说一旦建好这棵树。
在执行这个逻辑的时候非常快,所有的处理全部在内存里。再一个就是有人会觉得这个操作太慢了。一开始要等好长时间,太慢了,只是在执行这段逻辑,比如刚才我们循环里如果想我要获取element,然后要去获取这个element里面的具体的数据,然后把trim一下。然后判断他是〈name〉还是是〈size〉这的具体逻辑,在执行这些逻辑它就会比较快,因为它整个在内存,
三、Parsing an XML Document -SAX
但是一开始会等了很长时间,这个问题怎么解决?
就是提出SAX一个解题方法,在解析的时候不要一次性把整个xml文档全部拿到内存里建立DOM树,而是就一点一点的把它的内容读进来,每读到一个重要的事件的时候,我就激发一个事件出来,比如说我读到一个开始标签的时候,就是一个尖括号的时候,会触发一个事件,得到结束标签的时候,再触发一个事件,于是就像流数据一样进行处理,那这样的好处是我没有一棵DOM树,我直接就是在里面去引流的方式,碰到一个事物,触发一个事件,我一开始速度很快,不会要去等,但是唯一缺点是他既然想留的话,就是留的一个缺点就是没有一个完整的触发,比如当往回追溯的时候你可能还要再来一遍,他是另外一个处理的方法,可以看到就是它的事件包括一个元素的开始和一个元素的末尾,读到这个文件,读到字符串元素数据,于是他编程的方式,同样的一个解析方法,当SAX来解析的时候,它会产生很多实践。一开始是开始元素,名字叫做〈font〉,然后又碰到一个开始元素,叫做〈name〉然后是中间字符数据,然后是结束,以此类推,它会激发出这些事件,而这些事件就会发给这个解析器,它会去做解析,所以看他的解析的过程就变成我要去产生一个处理器,当产生startElement事件之后,我应该做些什么事情。那当然还有像这个专门处理and element这样的东西。所以他是以流的方式处理的,
四、Parsing an XML Document -STAX
另外还有一种解析STAX,他就意图想把这个STAX和DOM组合起来去做处理,但是大家可以看到,其实它编成上面和前面的没有什么太大的差异,他只是体现在它最终的性能,所以XML用刚才的我们去解析都可以,
那其他的解析过程不想多讲了,我想讲一讲。XML的这个数据的一个校验,就是DTD和XML Schema是什么意思,就是如果要说写了一个文件,你的文件不符合格式要求的,DTD是用专门的自己的语言写的,
比如这种看到要求〈font〉标签里头必须有一个儿子,它的一个好处是它表示出来比较简单。短小精干,缺点就是它描述是一种新的语言,要学一个新的语言,有人想这种方式不好,我们要用xml的方式来描述xml的格式,于是就有了xml scheme来描述XML, 首先有一个元素,名为font,它里头按照顺序有两个元素,一个name,一个size,他们的数据类型一个是string类型,一个是int类型,一个类型这就是以XML的方式来描述xml的格式,那么解析器它会根据这个XML Schema,然后拿着刚才那个数据来校验,看你那个刚才的数据符合不符合XML Schema这个定义的标准,或者是dvd定义的标准,如果不符合,那么解析器不会继续往下解析,所以d td和XML Schema的作用就是在校验用户写的XML本身是否符合格式,如果不指定DOM和XML Schema作为解析器,就会默认符合要求。
我们再来看DTD的详细语法,这是一个新的一个语言,跟刚才不一样。我们看到的XML Schema或者是DTD,就是要在文件头上去写SYSTEM “xonfig.dtd”这个东西,就在文件头里面要讲清楚你这个东西是什么样的,XML文件是符合哪个DTD的描述,将来解析就会拿这一个DTD或者是XML Schema来校验你的资料符合不符合要求。这个DTD写法就比较复杂,就是他有自己的语法,XML就是用XML Schema的方式,无论是哪一个XML Schema还是DTD,你只要写了。解析器就会根据你指定的格式去做校验。
五、Locating Information with XPath
可以用一个叫做XPath的东西里面直接去搜索,好处就是让用户使用起来方便,你不要自己去DOM或者是SAX解析程序。你直接写一个XPath 它就能自动在这个XML文件里找出你想要找的那个东西。举个例子,这就是一个XPath,他唯一的指向在这Configuration里头,这个database里头的标签,你通过这个快速定义标签,这里面内容就比较方便,那就是他有他自己的语法,怎么去描述一些标签。那这是在表示主要是第一个row的属性。编程的方式有它自己的作用,就是你可以这样的自己去写,然后他就到这个doc里面,按照你这个标签去找出你要找的username的值,可以看到用XPath这比解析还要方便。
六、XQuery
XQuery与XPath类似,他的写法就是让你用在SQL关系数据库里面搜索一样,去操作XML的数据,那它有自己的语法,这是一个什么文件,你要去里面的时候,请这样的方式来取,他就是在这个books.xml文件里面,
按照这个路径去取里面内容。然后名字空间其实没什么,就跟你们家代码写的一样,就是我在一个XML Schema里面定义了一种元素,在另外一个XML Schema里面也定义了这个元素。如果我在一个XML文件同时引用这两个XML Schema的名字,就会产生冲突,为了不产生冲突,定义名字空间区别他俩。
七、XML Transformations
最后我讲一个稍微看着有点意思的东西,它叫做XML的转换,就叫XSLT,就是一个XML的一个样式转换表,意思是我给你一个XML的文件,你可以通过样式转换表去过滤它,产生新的格式的文件,看一下效果,
这是一个XML文件。还有staff,里面有三个employee,每个都有自己的name 、salary 、hiredate。其中hiredate还有年月日三个属性,现在我想产生一个这样的一个XML的一个文件,数据就是从刚才来的,但是我把他展示成一个表,里面包含三行,第一列就是人名,第二列salary、第三列是他的年月日,凑到一起的这样的一个东西。我怎么数据就是从前面来的,可以用XML转换表来做,转换表里面要写一个template,他说清楚它的输出就是html文件,然后在样式转换表里面写要去匹配刚才staff里的employee,然后怎么匹配,说要把它写到一个TR里面,然后应用的映射模板是后面这个〈xsl:apply-templates/〉,就在这里面去写一下这个模板,关于name是怎么映射的,直接把name拿出来
然后关于hiredate怎么映射的,要组织td的那个数据,把year属性拿出来加一个横线,再把month属性拿出来,再加个横线,再把day数据拿出来,三个拼起来就是刚才看到的这个效果,()这个样式转换表的具体逻辑不用特别关心,它的含义实际上是这样一个过程:一个xml文件经过样式转换表可以生成另外一个文件,那于是我们可以看到同样一张XML的表,我通过xml转换表生成一个适合在pc网页上展示的HTML,我也可以去生成一个适合在手机app上展示的一个HTML25,同一个数据转换成不同类型的这个结果,让他在不同的这个设备上去展示,这不是很好的事情。
那所以最好的就是我写一个网页,它完全按照XML的格式写,什么叫完全按照XML格式写呢?
我们刚才说这个〈p〉在xml上面允许的,XML里面是不允许的,就是HTML里面允许,在XML里面不允许,你必须写成这样〈/p〉。就是有始有终,那所有的网页我如果全部按照XML的这种约定去写,那这种网页就叫XSLT了。那它的好处是什么?它本质上它既是XML,又是一个XSLT,所以我用不同的样式转换表,就可以转换成适合在不同的终端上去显示HTML的文件,这就是我想要做的一件事情。所以我们看到对有的的网页,我就把它生成这样的,
可能比较适合在手机上显示,但是对有的网页,我可能就会把这个样式变得复杂一点,它就不是个table,他也可以是一个这样的东西。那就是说为同一个页面可以开不同的样式转换,生成不同的结果,这样的话我就事半功倍。
所以总结一下,我们大量的使用annotation去做注解,XML出现了很少,但是你至少知道了XML有两个用处,第一个就是可以来描述数据,第二就是可以拿它跟XHML结合生成XHTML,将来通过样式转换生成不同的页面。当然我说的这两个用法在我们这门课里面可能都不太会用到,要学会XML怎么写,因为在后面的应用的配置文件里面确实还会用XML,
这个转换的过程是不是有点儿类似于又写了一个HTML?就是说样式转换表只写一次,然后以后像这种页面可能有很多个。然后所有的人都通过这样的转换表去转换,转换出来的都是类似这样的页面。那这样的话,我这个页面只写一次,就是这种页面可能会有很多个,但我每一个只写一次,然后用同一个转换,转换成不同的页面。
在数据转化的一个原因是这样的,XML确实比较复杂,Json它比较简单,XML的格式最大的问题就是说他没有用的东西太多了,比如说标签必须有开始有结束,jason他确实省容量,带宽占用更少,但是就是用xml,如果你只是把他当描述数据的方式,然后再传递,确实不是很有利,但是我刚才讲到的这种html通过样式转换表来转换出不同的一个html,这是比较重要的一种应用,这种应用才是我们应该去考虑去发扬它的一个好处的地方,然后就是说大家可以想一想为什么在后端的很多配置文件里面仍然用XML,还有一个好处就是xml可以通过刚才我提到的DTD或者是XML Schema去做这个xml文件的合法性的一个校验,也就是说如果你写的不对格式不对,我马上就会发现,我可以提示你一下有问题,你可以想象一下如果用其他的方法能不能达到这个效果,XML本身不太常拿来做数据的描述,它做配置文件,我们现在用的框架既可以用Anocation去表示,也可用XML去表示,效果一样。












