XML实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机系
实验报告
实验课程:XML
实验班级:网工(2)班学生姓名:
学生学号:
实验成绩:
一、实验目的
综合验证以下课程主要知识点:
1.XML语法
熟悉XML语法规范、能够编写形式良好的XML文档;
2.DTD和xml Schema文档约束
熟练使用DTD和XML Schema定义基本的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中的信息格式如下所示:
书名书号作者出版社出版日期
--------------------------------------------------------------------
name 1234 Tom 清华2011
2)使用DOM方式解析
从XML文档books.xml中获取“书名”、“书号”、“作者”、“出版社”、“出版日期”,并将它们封装到一个javabean类中,然后利用该类中的数据,通过DOM构造一棵DOM文档树,并将其序列化到一个XML文件中simplebooks.xml。
4.编写一个XSLT转换文档,转换到HTML
对于上一步通过DOM序列化出来的simplebooks.xml,编写一个XSLT文档books.xslt,将simplebooks.xml转换成为一个HTML格式表格形式呈现。该HTML通过浏览器呈现出来的外观应该类似如下所示:
书名书号作者出版社出版日期
name 1234 Tom 清华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的编码格式:chcp 437
再继续验证,果然可以啦~
至此,我明白了一句话:解决编码问题,是程序员最基本的素质之一!
关于修改cmd编码格式的链接资料:/samdy2008/article/details/5120466
3.使用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类中,可以看到,我采用的方法
是集合加泛型,即List
2)使用DOM方式解析
1.Book类中的和SAX中的一样,就不列出来了。