| Guo's profile版权所有,转载须作者同意PhotosBlogLists | Help |
|
August 28 正则表达式 转http://www.regexlab.com/zh/regref.htm引言 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。
1. 正则表达式规则1.1 普通字符 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。 1.2 简单的转义字符一些不便书写的字符,采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。 表达式 可匹配 \r, \n 代表回车和换行符 \t 制表符 \\ 代表 "\" 本身 还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "\" 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就需要写成 "\^" 和 "\$"。 表达式 可匹配 \^ 匹配 ^ 符号本身 \$ 匹配 $ 符号本身 \. 匹配小数点(.)本身 这些转义字符的匹配方法与 "普通字符" 是类似的。也是匹配与之相同的一个字符。 1.3 能够与 '多种字符' 匹配的表达式正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符。比如,表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。 表达式 可匹配 \d 任意一个数字,0~9 中的任意一个 \w 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个 \s 包括空格、制表符、换页符等空白字符的其中任意一个 . 小数点可以匹配除了换行符(\n)以外的任意一个字符 举例1:表达式 "\d\d",在匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"12";匹配到的位置是:开始于3,结束于5。 1.4 自定义能够匹配 '多种字符' 的表达式使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。 表达式 可匹配 [ab5@] 匹配 "a" 或 "b" 或 "5" 或 "@" [^abc] 匹配 "a","b","c" 之外的任意一个字符 [f-k] 匹配 "f"~"k" 之间的任意一个字母 [^A-F0-3] 匹配 "A"~"F","0"~"3" 之外的任意一个字符 举例1:表达式 "[bcd][bcd]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"bc";匹配到的位置是:开始于1,结束于3。 1.5 修饰匹配次数的特殊符号 前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。 表达式 作用 {n} 表达式重复n次,比如:"\w{2}" 相当于 "\w\w";"a{5}" 相当于 "aaaaa" {m,n} 表达式至少重复m次,最多重复n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa" {m,} 表达式至少重复m次,比如:"\w\d{2,}"可以匹配 "a12","_456","M12344"... ? 匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad" + 表达式至少出现1次,相当于 {1,},比如:"a+b"可以匹配 "ab","aab","aaab"... * 表达式不出现或出现任意次,相当于 {0,},比如:"\^*b"可以匹配 "b","^^^b"... 举例1:表达式 "\d+\.?\d*" 在匹配 "It costs $12.5" 时,匹配的结果是:成功;匹配到的内容是:"12.5";匹配到的位置是:开始于10,结束于14。 1.6 其他一些代表抽象意义的特殊符号一些符号在表达式中代表抽象的特殊意义: 表达式 作用 ^ 与字符串开始的地方匹配,不匹配任何字符 $ 与字符串结束的地方匹配,不匹配任何字符 \b 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符 进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。 一些符号可以影响表达式内部的子表达式之间的关系: 表达式 作用 | 左右两边表达式之间 "或" 关系,匹配左边或者右边 ( ) (1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰 举例5:表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时,匹配结果是:成功;匹配到的内容是:"Tom";匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack";匹配到的位置时:开始于15,结束于19。 2. 正则表达式中的一些高级规则2.1 匹配次数中的贪婪与非贪婪在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下: 表达式 匹配结果 "\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd" "\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d" 由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。 非贪婪模式: 表达式 匹配结果 "\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x" 为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx" 更多的情况,举例如下: 2.2 反向引用 \1, \2... 表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。 举例如下: 2.3 预搜索,不匹配;反向预搜索,不匹配前面的章节中,我讲到了几个代表抽象意义的特殊符号:"^","$","\b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的,更加灵活的表示方法。 正向预搜索:"(?=xxxxx)","(?!xxxxx)" 格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。 反向预搜索:"(?<=xxxxx)","(?<!xxxxx)" 3. 其他通用规则还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。 3.1 表达式中,可以使用 "\xXX" 和 "\uXXXX" 表示一个字符("X" 表示一个十六进制数) 形式 字符范围 \xXX 编号在 0 ~ 255 范围的字符,比如:空格可以使用 "\x20" 表示 \uXXXX 任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示,比如:"\u4E2D" 3.2 在表达式 "\s","\d","\w","\b" 表示特殊意义的同时,对应的大写字母表示相反的意义 表达式 可匹配 \S \D \W \B 匹配非单词边界,即左右两边都是 "\w" 范围或者左右两边都不是 "\w" 范围时的字符缝隙 3.3 在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符汇总 字符 说明 ^ 匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^" $ 匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$" ( ) 标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)" [ ] 用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]" { } 修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}" . 匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\." ? 修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?" + 修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+" * 修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*" | 左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|" 3.4 括号 "( )" 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 "(?:xxxxx)" 格式 举例1:表达式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 时,结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录,因此 "(\w)" 使用 "\1" 来引用。 3.5 常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global 表达式属性 说明 Ignorecase 默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。 Singleline 默认情况下,小数点 "." 匹配除了换行符(\n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。 Multiline 默认情况下,表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如: Global 主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。 4. 其他提示4.1 如果想要了解高级的正则引擎还支持那些复杂的正则语法,可参见本站 DEELX 正则引擎的说明文档。 4.2 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用 "^" 和 "$",比如:"^\d+$" 要求整个字符串只有数字。 4.3 如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 "\b",比如:使用 "\b(if|while|else|void|int……)\b" 来匹配程序中的关键字。 4.4 表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:"\d*\.?\d*",因为如果什么都没有,这个表达式也可以匹配成功。更好的写法是:"\d+\.?\d*|\.\d+"。 4.5 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,那么情况可能比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。 4.6 合理选择贪婪模式与非贪婪模式,参见话题讨论。 4.7 或 "|" 的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为 "|" 两边的表达式因为交换位置而有所不同。 August 27 清华大学校长顾秉林接受采访的新闻报道 --转载昨天下午,清华大学校长顾秉林先生在接受学生记者采访的时候,表达了他对现在大学教育状况的担心,他表示,说得直白一点,现行的大学教育制度就是“在往学生们的脑子里灌屎”。 August 26 MVC evolves: the Page ControllerA somewhat different implementation of MVC has been popularized by frameworks
A lightweight container is different—it gives you the ability to add features to a generic container, thereby making a unique container that fits the August 21 随笔:国际惯例与中国国情对比表 --转载今天看到新京报的一条新闻: 《北京警方澄清虐杀狗传言 称入户宣传非入户查抄》,里面有段报道:“北京市农业局畜牧兽医处副处长王滨表示,目前他们主要是配合公安机关工作。他表示,按照相关规定,这次重点治理的九类犬,比如在重点管理区饲养大型犬、烈性犬;无证养犬;一户养多犬;流浪犬等。一旦无证犬被查获,将收容在犬类留检所。自收容之日起7日内无人认领、领养的,按照国际惯例处理。” 当时一看,就吓了一跳,额的神,这个“国际惯例”还 ZTMNB。我只听说现在成天嚷嚷的银行卡收费、油价上涨、高薪养廉是国际惯例,什么时候,打狗行业也要引入国际惯例了? 这些年,这两个词,大家都耳熟能详了,一个就是“国际惯例”,另一个就是“中国国情”。当对利益部门和垄断集团有利而对老百姓无利时,例如银行收费、油价上涨、高薪养廉、住房商业化等等时,他们就说,这是与国际结轨, 纷纷用“国际惯例”改进自己的工作,形成了一股采用“国际惯例”提价、涨价的热潮;与此同时,在涉及到老百姓切身利益的工资水平、医疗保障、电信收费、房价等种种不符合“国际惯例”的情况时,给民众的解释却是“要照顾中国国情”。 倒底这国际惯例和中国国情,是个啥子东东呢?也许是自己技术人员的缘故, 凡事喜欢较真追求逻辑清楚,心想:何不列个表格出来,一一对比,看个清清楚楚?于是,我做花了一个晚上的时间,整理了下方的这个《国际惯例与中国国情对比表》。 表格中的内容与数据,没有夹杂我的任何评论与个人观点。所有的数据、资料、观点、评论的资料,都有出处, 来源于下表中的40篇文章:
有鉴于本文最近一个星期在凯迪、文学城、新浪等大型媒体频繁转载,引起了较大的争论, 本人于 2006.12.22 重新声明如下: 1. 所有的数据资料,都在表格中注明了来源及出处链接。本文中所有罗列的数据以及言论,不代表本人的观点。 2. 近 90% 的资料来源于我们国家最权威最喉舌的新华通讯社之新华网,本人不负责担保数据 100% 的准确性。 3. 本人只是一名普通开发人员。写此文没有任何政治企图,纯属好玩而已。 4. 对列表中数据不准确的地方,您可以提出疑问,也可以列出举证。但是,请不要对我进行人身攻击。评论中骂人的贴子,对不起,我的地盘我作主,我看着不爽,嘿嘿,直接删除了。:) 我只是罗列了一些事实,列举了一些数据,至于这种现实的好与坏、对与错、解决方案,我水平有限,不愿谈也谈不出个一二三来,各位读者自己分析吧。:-) 另外,如果你发现还有其他的“国际惯例”或“中国国情”,或者表中数据不对的地方,欢迎在评论中也列举出来,方便我不断完善这个表格。——当然,你也必须象我这样,注明数据出处,数据出处最好是来自新华网。 注意: 本文可自由转载。但是, 必须满足下列条件: 1. 转载页面需要保留链接至本文地址: http://www.xiaohui.com/weekly/20061115.htm 2. 必须全文完整转载。表格部分的内容必须以表格的形式或图片形式转载, 以保持表格对比的完整性。 国际惯例与中国国情对比表(一)http://www.xiaohui.com/weekly/20061115.htm
国际惯例与中国国情对比表(二)http://www.xiaohui.com/weekly/20061115.htm
感谢: 在整理本表格过程中, 得到阿达、Tian、xjb、扫地老僧 等朋友的帮助, 特表示谢意 注意: 本文可自由转载。但是, 必须满足下列条件: 1. 转载页面需要保留链接至本文地址: http://www.xiaohui.com/weekly/20061115.htm 2. 必须全文完整转载。表格部分的内容必须以表格的形式或图片形式转载, 以保持表格对比的完整性。 August 20 JavaScript RegExp 对象参考手册RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。 RegExp 对象的方法FF: Firefox, N: Netscape, IE: Internet Explorer
支持正则表达式的 String 对象的方法FF: Firefox, N: Netscape, IE: Internet Explorer
RegExp 对象的属性
August 19 JavaScript Math 对象的参考手册Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(),像 Math.sin() 这样的函数只是函数,不是某个对象的方法。 Math 对象的方法FF: Firefox, N: Netscape, IE: Internet Explorer
Math 对象的属性FF: Firefox, N: Netscape, IE: Internet Explorer
JavaScript Boolean 对象的参考手册Boolean 对象是 JavaScript 的一种基本数据类型。 Boolean 对象是一个把布尔值打包的布尔对象。 Boolean 对象的方法FF: Firefox, N: Netscape, IE: Internet Explorer
Boolean 对象的属性FF: Firefox, N: Netscape, IE: Internet Explorer
JavaScript Array 对象的参考手册Array 对象的方法FF: Firefox, N: Netscape, IE: Internet Explorer
Array 对象的属性FF: Firefox, N: Netscape, IE: Internet Explorer
JavaScript Array 对象的参考手册Array 对象的方法FF: Firefox, N: Netscape, IE: Internet Explorer
Array 对象的属性FF: Firefox, N: Netscape, IE: Internet Explorer
JavaScript Date 对象参考手册Date 对象是 JavaScript 的一种内部数据类型。 Date 对象没有可以直接读写的属性,所有对日期和时间值的访问都是通过其方法执行的。 请从下面的表格访问有关 Date 对象的方法的详细信息。 Date 对象的方法FF: Firefox, N: Netscape, IE: Internet Explorer
Date 对象的属性FF: Firefox, N: Netscape, IE: Internet Explorer
JavaScript String 对象参考手册字符串是 JavaScript 的一种基本的数据类型。 String 对象的 length 属性声明了该字符串中的字符数。String 类定义了大量操作字符串的方法。 需要注意的是,JavaScript 的字符串是不可变的,String 类定义的方法都不能改变字符串的内容。 String 对象的方法FF: Firefox, N: Netscape, IE: Internet Explorer
String 对象的属性FF: Firefox, N: Netscape, IE: Internet Explorer
August 18 JavaScript当页面载入时,会执行位于 body 部分的 JavaScript。 当被调用时,位于 head 部分的 JavaScript 才会被执行。 实例
恒等运算符 (===、!==) 除了不进行类型转换,并且类型必须相同以外,这些运算符与相等运算符的作用是一样的。
isNaN() 函数用于检查其参数是否是非数字值。
如果 x 是特殊的非数字值 NaN(或者能被转换为这样的值),返回的值就是 true。如果 x 是其他值,则返回 false。 August 15 福娃合体--转载05年福娃发布2天后,大家出于好玩都在画福娃同人,我也画了个
如今却看到了这个!!!! ~~被弄成山寨文化了 连胸口我的LOGO都给弄上去了 淘宝上开始卖了 http://auction1.taobao.com/auction/item_detail-0db1-9582a17f70802e4ca2790f0d318dfdfe.jhtml?cm_cat= XPath 节点在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。 XPath 术语节点(Node)在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。 请看下面这个 XML 文档: <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore> 上面的XML文档中的节点例子: <bookstore> (文档节点) <author>J K. Rowling</author> (元素节点) lang="en" (属性节点) 基本值(或称原子值,Atomic value)基本值是无父或无子的节点。 基本值的例子: J K. Rowling "en" 项目(Item)项目是基本值或者节点。 节点关系父(Parent)每个元素以及属性都有一个父。 在下面的例子中,book 元素是 title、author、year 以及 price 元素的父: <book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> 子(Children)元素节点可有零个、一个或多个子。 在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子: <book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> 同胞(Sibling)拥有相同的父的节点 在下面的例子中,title、author、year 以及 price 元素都是同胞: <book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> 先辈(Ancestor)某节点的父、父的父,等等。 在下面的例子中,title 元素的先辈是 book 元素和 bookstore 元素: <bookstore> <book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore> 后代(Descendant)某个节点的子,子的子,等等。 在下面的例子中,bookstore的后代是 book、title、author、year 以及 price 元素: <bookstore> <book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore> August 14 XSD 字符串数据类型字符串数据类型用于可包含字符串的值。 字符串数据类型(String Data Type)字符串数据类型可包含字符、换行、回车以及制表符。 下面是一个关于某个 scheme 中字符串声明的例子: <xs:element name="customer" type="xs:string"/> 文档中的元素看上去应该类似这样: <customer>John Smith</customer> 或者类似这样: <customer> John Smith </customer> 注释:如果您使用字符串数据类型,XML 处理器就不会更改其中的值。 规格化字符串数据类型(NormalizedString Data Type)规格化字符串数据类型源自于字符串数据类型。 规格化字符串数据类型同样可包含字符,但是 XML 处理器会移除折行,回车以及制表符。 下面是一个关于在某个 schema 中规格化字符串数据类型的例子: <xs:element name="customer" type="xs:normalizedString"/> 文档中的元素看上去应该类似这样: <customer>John Smith</customer> 或者类似这样: <customer> John Smith </customer> 注释:在上面的例子中,XML 处理器会使用空格替换所有的制表符。 Token 数据类型(Token Data Type)Token 数据类型同样源自于字符串数据类型。 Token 数据类型同样可包含字符,但是 XML 处理器会移除换行符、回车、制表符、开头和结尾的空格以及(连续的)空格。 下面是在 schema 中一个有关 token 声明的例子: <xs:element name="customer" type="xs:token"/> 文档中的元素看上去应该类似这样: <customer>John Smith</customer> 或者类似这样: <customer> John Smith </customer> 注释:在上面这个例子中,XML 解析器会移除制表符。 字符串数据类型请注意,所有以下的数据类型均衍生于字符串数据类型(除了字符串数据类型本身)! 名称 ENTITIES ENTITY ID IDREF IDREFS language Name NCName NMTOKEN NMTOKENS normalizedString QName string token 对字符串数据类型的限定(Restriction)可与字符串数据类型一同使用的限定:
August 12 XSD 元素<any> 元素使我们有能力通过未被 schema 规定的元素来拓展 XML 文档! <any> 元素<any> 元素使我们有能力通过未被 schema 规定的元素来拓展 XML 文档! 下面这个例子是从名为 "family.xsd" 的 XML schema 中引用的片段。它展示了一个针对 "person" 元素的声明。通过使用 <any> 元素,我们可以通过任何元素(在 <lastname> 之后)扩展 "person" 的内容: <xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
现在,我们希望使用 "children" 元素来扩展 "person" 元素。这此种情况下我们就可以这么做,即使以上这个 schema 的作者没有声明任何 "children" 元素。 请看这个 schema 文件,名为 "children.xsd": <?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<xs:element name="children">
<xs:complexType>
<xs:sequence>
<xs:element name="childname" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
下面这个 XML 文件(名为 "Myfamily.xml"),使用了来自两个不同的 schema 中的成分,"family.xsd" 和 "children.xsd": <?xml version="1.0" encoding="ISO-8859-1"?>
<persons xmlns="http://www.microsoft.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:SchemaLocation="
上面这个 XML 文件是有效的,这是由于 schema "family.xsd" 允许我们通过在 "lastname" 元素后的可选元素来扩展 "person" 元素。 <any> 和 <anyAttribute> 均可用于制作可扩展的文档!它们使文档有能力包含未在主 XML schema 中声明过的附加元素。 XSD 复合元素复合元素包含了其他的元素及/或属性。 什么是复合元素?复合元素指包含其他元素及/或属性的 XML 元素。 有四种类型的复合元素:
注释:上述元素均可包含属性! 复合元素的例子复合元素,"product",是空的: <product pid="1345"/> 复合元素,"employee",仅包含其他元素: <employee> <firstname>John</firstname> <lastname>Smith</lastname> </employee> 复合元素,"food",仅包含文本: <food type="dessert">Ice cream</food> 复合元素,"description",包含元素和文本: <description> It happened on <date lang="norwegian">03.03.99</date> .... </description> 如何定义复合元素?请看这个复合 XML 元素,"employee",仅包含其他元素: <employee> <firstname>John</firstname> <lastname>Smith</lastname> </employee> 在 XML Schema 中,我们有两种方式来定义复合元素:1. 通过命名此元素,可直接对"employee"元素进行声明,就像这样: <xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
假如您使用上面所描述的方法,那么仅有 "employee" 可使用所规定的复合类型。请注意其子元素,"firstname" 以及 "lastname",被包围在指示器 <sequence>中。这意味着子元素必须以它们被声明的次序出现。您会在 XSD 指示器 这一节学习更多有关指示器的知识。 2. "employee" 元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称: <xs:element name="employee" 如果您使用了上面所描述的方法,那么若干元素均可以使用相同的复合类型,比如这样: <xs:element name="employee" type="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
您也可以在已有的复合元素之上以某个复合元素为基础,然后添加一些元素,就像这样: <xs:element name="employee" type="fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
XSD 限定 / Facets限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。 对值的限定下面的例子定义了带有一个限定且名为 "age" 的元素。age 的值不能低于 0 或者高于 120: <xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对一组值的限定如需把 XML 元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration constraint)。 下面的例子定义了带有一个限定的名为 "car" 的元素。可接受的值只有:Audi, Golf, BMW: <xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
上面的例子也可以被写为: <xs:element name="car" 注释:在这种情况下,类型 "carType" 可被其他元素使用,因为它不是 "car" 元素的组成部分。 对一系列值的限定如需把 XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)。 下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值只有小写字母 a - z 其中的一个: <xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子定义了带有一个限定的名为 "initials" 的元素。可接受的值是大写字母 A - Z 其中的三个: <xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z][A-Z][A-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子也定义了带有一个限定的名为 "initials" 的元素。可接受的值是大写或小写字母 a - z 其中的三个: <xs:element name="initials">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子定义了带有一个限定的名为 "choice 的元素。可接受的值是字母 x, y 或 z 中的一个: <xs:element name="choice">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[xyz]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下一个例子定义了带有一个限定的名为 "prodid" 的元素。可接受的值是五个阿拉伯数字的一个序列,且每个数字的范围是 0-9: <xs:element name="prodid">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对一系列值的其他限定下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值是 a - z 中零个或多个字母: <xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z])*"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值是一对或多对字母,每对字母由一个小写字母后跟一个大写字母组成。举个例子,"sToP"将会通过这种模式的验证,但是 "Stop"、"STOP" 或者 "stop" 无法通过验证: <xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z][A-Z])+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下面的例子定义了带有一个限定的名为 "gender" 的元素。可接受的值是 male 或者 female: <xs:element name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="male|female"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
下面的例子定义了带有一个限定的名为 "password" 的元素。可接受的值是由 8 个字符组成的一行字符,这些字符必须是大写或小写字母 a - z 亦或数字 0 - 9: <xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z0-9]{8}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对空白字符的限定如需规定对空白字符(whitespace characters)的处理方式,我们需要使用 whiteSpace 限定。 下面的例子定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "preserve",这意味着 XML 处理器不会移除任何空白字符: <xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这个例子也定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "replace",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符): <xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这个例子也定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "collapse",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格): <xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对长度的限定如需限制元素中值的长度,我们需要使用 length、maxLength 以及 minLength 限定。 本例定义了带有一个限定且名为 "password" 的元素。其值必须精确到 8 个字符: <xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这个例子也定义了带有一个限定的名为 "password" 的元素。其值最小为 5 个字符,最大为 8 个字符: <xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
数据类型的限定限定 enumeration fractionDigits length maxExclusive maxInclusive maxLength minExclusive minInclusive minLength pattern totalDigits whiteSpace XSD 属性所有的属性均作为简易类型来声明。 什么是属性?简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。 如何声明属性?定义属性的语法是:<xs:attribute name="xxx" type="yyy"/> 在此处,xxx 指属性名称,yyy 则规定属性的数据类型。XML Schema 拥有很多内建的数据类型。 最常用的类型是:
实例这是带有属性的 XML 元素: <lastname lang="EN">Smith</lastname> 这是对应的属性定义: <xs:attribute name="lang" type="xs:string"/> 属性的默认值和固定值属性可拥有指定的默认值或固定值。 当没有其他的值被规定时,默认值就会自动分配给元素。 在下面的例子中,缺省值是 "EN": <xs:attribute name="lang" type="xs:string" default="EN"/> 固定值同样会自动分配给元素,并且您无法规定另外的值。 在下面的例子中,固定值是 "EN": <xs:attribute name="lang" type="xs:string" fixed="EN"/> 可选的和必需的属性在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性: <xs:attribute name="lang" type="xs:string" use="required"/> 对内容的限定当 XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。 假如 XML 元素的类型是 "xs:date",而其包含的内容是类似 "Hello World" 的字符串,元素将不会(通过)验证。 通过 XML schema,您也可向您的 XML 元素及属性添加自己的限定。这些限定被称为 facet(编者注:意为(多面体的)面,可译为限定面)。您会在下一节了解到更多有关 facet 的知识。 定义简易元素 XML schema定义简易元素的语法:<xs:element name="xxx" type="yyy"/> 此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。 最常用的类型是:
例子:这是一些 XML 元素: <lastname>Smith</lastname> <age>28</age> <dateborn>1980-03-27</dateborn> 这是相应的简易元素定义: <xs:element name="lastname" type="xs:string"/> <xs:element name="age" type="xs:integer"/> <xs:element name="dateborn" type="xs:date"/> 简易元素的默认值和固定值简易元素可拥有指定的默认值或固定值。 当没有其他的值被规定时,默认值就会自动分配给元素。 在下面的例子中,缺省值是 "red": <xs:element name="color" type="xs:string" default="red"/> 固定值同样会自动分配给元素,并且您无法规定另外一个值。 在下面的例子中,固定值是 "red": <xs:element name="color" type="xs:string" fixed="red"/> |
|
|