今天我们来探索一下XMLSPY,看看这个软件里有多少我们上机考能用到的东西!

由于我电脑上是中文版,所以读者请自行翻译回英文找相对应的位置

DTD

(一)如何获取未知信息

在DTD的编写中,我们要学会通过Grid视图来获取我们所需要的信息。

不过首先我们要先会写一个元素和一个属性来通过有效性验证。

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT HEROS (hero)>
<!ATTLIST A
id ID #REQUIRED
>

之后我们进入Grid视图,并选取HEROS元素(他是DTD应用到XML文档的根元素)

我们可以看到,右上角是根元素声明时可以采取的所有类型,下面则是这个根元素的子元素们组成的方式,分别对应默认值,?,+,*

下面我们来看属性

同理,将鼠标分别点击Type和Presence(存在方式)的元素中,右上角会出现它的所有可取值,此时可以双击进行更换。这样就避免了不知道取值而不会做题的情况,较为实用。

(二)关于DTD的自动生成问题

在实验中,题目是给我们.xml文件,让我们编写相对应的.dtd文件。很多同学因为对dtd不太熟悉,想通过生成直接得到答案,但这样生成的dtd往往不是老师想要的答案,那么要怎么尽量修改的像一点呢?我们拿第二次实验的SpyBase2.xml和对应的.dtd来举例子。

1.如何从xml生成dtd?

我们使用菜单栏“DTD/Schema”目录下的“产生DTD/模式(E)”功能

2.有什么注意事项?

将枚举改为0的原因是,按默认设置转换出来的dtd,会枚举每一个出现过的数值,而这在考试要求中可能并没有出现,从而使老师得知你是通过转换得来的,下面是一个对比

在将枚举值改为零后,属性的默认类型就从枚举变成了文本类型(CDATA)

之后,再根据题目中说的要求,对生成后的.dtd文件进行改动。如本题中要求使用参数实体替换所有的#PCDATA和CDATA,则在dtd中编写如下代码:

1
2
3
<!ENTITY % pc "#PCDATA">   <!--注意空格和引号-->
<!ENTITY % cd "CDATA">
<!ELEMENT status (%pc;)> <!--替换实例 -->

SCHEMA

众所周知,SCHEMA很难写,所以还是得仔细过亿遍

我们拿第三次实验的SpyBase2.xml和对应的.xsd来举例子。

(一)如何获取未知信息

同理,我们先生成一个xsd文件,再转到他的SCHEMA视图

这个界面会列举出你文章中的全局元素和全局类型,如果自己编写一些类型,效果如下。

我们点击蓝色按钮进入下一步的视图,先点击一个元素试试

我们选取了一个具有简单类型的元素,在右侧显示出了他的元素类型、出现次数等内容,因为它属于string类型,所以下方还有进一步限制他的length等属性,直接在下方修改即可影响到XSD内的内容,比较方便。

下面再点一个属性

内容与元素的基本一致,因为它属于decimal类型,所以下方还有进一步限制他的minInclusive totalDigit等属性,直接在下方修改即可影响到XSD内的内容,比较方便。

提示

minInclusive和maxInclusive是闭区间,min即最小值,max即最大值

而minExclusive和maxExclusive是开区间,min即最小值+1,max是最大值-1

(二)关于XSD的自动生成问题

1.如何从xml生成xsd?

我们使用菜单栏“DTD/Schema”目录下的“产生DTD/模式(E)”功能,选择W3C模式

2.有什么注意事项?

首先要去掉W3C模式下面第一项的勾,这样可以避免生成的子元素的类型全部为ref(引用),造成错误。

将枚举字符置为0的原因与DTD中一致。

转换之后,该xsd的大致框架便已完成,此时再根据题目中的各种约束条件,对生成后的xsd文件进行修改,若熟练的话可以直接在SCHEMA视图下进行修改,这样效率较高。

提示

①题目中可能会要求写自己定义的简单类型或者复杂类型,但自动生成的xsd文件是默认生成了无名的类型直接放在了对应的元素下,所以要特别注意这一点

②自动生成的元素和属性的类型都是XMLSPY近似判断的,所以可能会出现写错的情况,要对着题目检查一遍。

重点

记得删掉默认生成的注释

如果要交xml文件和xsd文件的话,记得将xsd文件约束在xml文件上,并将绝对路径改为相对路径。

1
2
3
<spyTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/Users/10971/Desktop/1.xsd">
改为
<spyTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="1.xsd"> <!--要和xsd文件放在同一目录下-->

XPATH

(一) XPATH函数

在考察XPATH时,试题更多的是考察你对XPATH表达式的理解(比如如何利用子孙关系挑选出那个元素),对XPATH函数的考察其实较少,我们只需要记住常用的几个即可。

我们可以曲线救国,从XQUERY中得到XPATH函数及其用法(好不容易找到的)

首先随便打开一个xquery文件

我们惊喜的发现,这些函数中的很大一部分与XPATH函数重合了。与之前一样,在你需要的地方双击即可写出这个函数,同时还有奇效

可以看到,XMLSPY提示了这个函数的参数,再加上英文名我们便可知道这个函数的用法,这样就不至于不知道到底能用哪个函数了。

当然你不喜欢这样的话,请参考后文:记不住正则表达式怎么办

XSLT

没有技巧,自生自灭

XQUERY

(一) 如何自动缩进

在编写好.xq文件,应用在xml文件后,生成的.xml文件是默认不会缩进的,这让我们看着很头疼,无法及时分辨出XQUERY是否查询正确。

懂一点的朋友可能知道,在Edit栏下有一个调整排版的按钮(Pretty Print)点一下之后就可以正常显示嵌套了。

但是我们想像XSLT那样,默认让其具有缩进(indent=”yes”), Xquery显然也考虑到了这一点。

我们点开XSL/XQuery一栏,点击最下面的设置

勾选缩进输出后,每次查询生成的XML文件就可以默认缩进辣!强迫症狂喜

一些小问题

(一) 记不住预定义实体怎么办啊

在XMLSPY中,当你打开一个.xml文件时,右下角会指出当前.xml文件中所用到的实体即:

此时,我们只需要在需要将光标放在引入实体的地方,双击右下角你需要引入的实体,即可引入,大功告成!

(二) 记不住正则表达式怎么办啊

别问,问就是自己提前建一个xml文件,用注释的方式全部打进去,考试的时候再打开就好了

注意

在正则表达式中,比如* . - 这些字符需要进行转义,即在他们前面加上\

结语

不想复习XML,但是不得不复习

宋亮教的真好啊!