计算机系实验报告实验课程:XML实验班级:网工(2)班学生姓名:学生学号:实验成绩:一、实验目的综合验证以下课程主要知识点:1.XML语法熟悉XML语法规范、能够编写形式良好的XML文档;2.DTD和xmlSchema文档约束熟练使用DTD和XMLSchema定义基本的XML元素、属性、限定等方面的模式约束。3.SAX解析、DOM解析以及JAXP了解SAX和DOM解析原理,能够使用JAXP接口完成对XML文档的解析和转换。4.XSLT和XPath能够使用XSLT和XPath完成从XML文档到HTML格式的转换。二、实验内容1.编写XML文档约束根据下图中显示的信息,编写一个DTD文档,其内容要求能够包含图中所有的信息点。图中所包含的信息点进行如下说明:2.编写一个XML文档,使其在DTD约束下是有效的假设上一步编写的DTD文档文件名为:books.dtd,编译一个XML文档使其在books.dtd文件的约束下成为一个有效的XML文档。然后,使用xmllint程序对你编写的XML文档进行有效性验证,具体如果使用,请参看“《XML》课程教案”中的相关内容。3.使用JAXP接口,对上一步完成的XML文档进行解析假设上一步编写的XML文档名为books.xml。1)使用SAX方式解析从XML文档books.xml中获得“书名”、“书号”、“作者”、“出版社”、“出版日期”这5个记录项的信息,并将其格式化输出到一个文件books.txt中。books.txt中的信息格式如下所示:书名书号作者出版社出版日期--------------------------------------------------------------------name1234Tom清华20112)使用DOM方式解析从XML文档books.xml中获取“书名”、“书号”、“作者”、“出版社”、“出版日期”,并将它们封装到一个javabean类中,然后利用该类中的数据,通过DOM构造一棵DOM文档树,并将其序列化到一个XML文件中simplebooks.xml。4.编写一个XSLT转换文档,转换到HTML对于上一步通过DOM序列化出来的simplebooks.xml,编写一个XSLT文档books.xslt,将simplebooks.xml转换成为一个HTML格式表格形式呈现。该HTML通过浏览器呈现出来的外观应该类似如下所示:书名书号作者出版社出版日期name1234Tom清华2011使用JAXP的XSL转换工厂,获得simpleboosk.xml通过books.xslt转换出来的HTML文件simplebooks.html。三、实验步骤1.编写XML文档约束books.dtd文档截图如下:2.编写一个XML文档,使其在DTD约束下是有效的books.xml文档截图如下:books.xml在IE下打开截图如下:验证有效性的截图如下:在此实验过程中遇到的问题以及解决的办法:1.最开始看到要求上写着书分为中文原版和外文翻译的时候,我大脑里蹦出来的就是为每一个book添加一个属性language来标识是中文还是外文,如下:a)当language=”ch”时,为中文,则后面的元素:原书名、译者、原出版社就不用出现了。b)当language=”en”,为外文,后面的属性全部要出现。但是等到我真正开始编写时,才知道它的难度,而且考虑到后面的解析也不好弄,就直接用了元素来代替,更加简单与直观,这里也是提出这种思路,有待以后实现!2.编码格式问题:在最开始编码时,我使用的是UTF-8,因为UTF-8是包含gb2312的,而且它的字符集要比gb2312大得多,但是有效性通不过,我意识到是否是文件保存时编码格式没改,于是我又把文件保存时编码格式改为UTF-8,这次通过了!可惜在DOS下验证有效性时,出现了乱码···当我把编码中的UTF-8改为gb2312。而且文件保存时编码格式改为ANSI时,神奇般的在DOS下验证有效性通过了(如上面的图所示)。太不可思议了,小字符集竟然比大字符集还要强大,我不死心,于是继续查资料,终于发现:哈哈,明白了吗?DOS下采用的编码格式竟然是GBK,肯定不会支持UTF-8格式的啊,同时,我又查到可以用临时修改方法修改cmd的编码格式:chcp437再继续验证,果然可以啦~至此,我明白了一句话:解决编码问题,是程序员最基本的素质之一!关于修改cmd编码格式的链接资料:使用JAXP接口,对上一步完成的XML文档进行解析1)使用SAX方式解析1.Book类中属性的声明:2.SaxParser获得解析器并对文件进行解析:3.MyHandler事件处理器:books.txt文档截图如下:在此实验过程中遇到的问题以及解决的办法:1.在最开始编写代码时,我的思路是边读取边写出到文件上,就在全部写完,打开txt文件一看,书号下面得到的竟然是作者,作者下面则是出版社,细细分析,发现写入文件的顺序与之前xml文件上元素的顺序是一样的,而和我们需要获取的顺序却不一样,于是我就在想难道不能先读取后面的,再读取前面的吗?查过资料后,答案是:不能!我也明白了SAX解析器的原理:流机制!SAX分析器在对XML文档进行分析时,触发了一系列的事件,由于事件触发本身是有时序性的,因此,SAX提供的是一种顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。SAX之所以被叫做简单应用程序接口,是因为SAX分析器只做了一些简单的工作,大部分工作还要由应用程序自己去做。也就是说,SAX分析器在实现时,它只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分、是否符合XML语法,然后再触发相应的事件,而事件处理函数本身则要由应用程序自己来实现。最后我还是采用了封装类的方法实现了!2.需要提出的是author这个属性,在前面的book类中,可以看到,我采用的方法是集合加泛型,即ListString,原因是author可能有多个,如果只是单纯的定义为String,则在进行解析的时候会出现后一个解析的会替换掉前一个,简单却不完美,故我采用了集合加泛型的方法,虽然解析的时候需要用的迭代、遍历等方法,但最终做出来还是很有成就感的!2)使用DOM方式解析1.Book类中的和SAX中的一样,就不列出来了。2.DomParser获得Dom解析器并进行解析:3.DOMSerializer序列化:simplebooks.xml文档截图如下:simplebooks.xml在IE下打开截图如下:在此实验过程中遇到的问题以及解决的办法:这个过程相对来说就简单一些了,可能是对解析的机制有些清晰了吧,在此,我也想着分析一下SAX和DOM解析的不同之处以及各种的优缺点:1.SAX解析的机制前面已经说过了,同DOM分析器相比,SAX分析器缺乏灵活性。然而,由于SAX分析器实现简单,对内存要求比较低,因此实现效率比较高,对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说,SAX分析器更为合适。2.DOM提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。4.编写一个XSLT转换文档,转换到HTMLXSLT文档截图:使用JAXP的XSL转换工厂:simplebooks.html在IE下打开:在此实验过程中遇到的问题以及解决的办法:主要是在编写XSLT文档是遇到的问题,由于第二本书的作者有两个,如果采用一般的方法则在html中只会出现一个作者,在系统的学习了一般XSLT之后,我决定采用XPath,直接去读取作者这个节点(如上所示),果然可以,但两个作者之间需要有空格进行区分, ;满足了我的要求, ;相当于html中的 哈哈,一切都在预料之中!至此,实验终于大功告成!!!四、实验总结