Guo's profile版权所有,转载须作者同意PhotosBlogLists Tools Help

Blog


    August 28

    正则表达式 转

    http://www.regexlab.com/zh/regref.htm
    引言

        正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。
        正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。
       正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。
        文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。

    [ 点击下载 chm 版本] - DEELX 正则语法,包含其他高级语法的 chm 版本。

    注意:下载的 chm 版本适合用来查阅,而本文适合用来学习,建议继续阅读。)


    1. 正则表达式规则
    1.1 普通字符

        字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
    举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)
    举例2:表达式 "bcd",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。


    1.2 简单的转义字符

        一些不便书写的字符,采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。

    表达式

    可匹配

    \r, \n

    代表回车和换行符

    \t

    制表符

    \\

    代表 "\" 本身

        还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "\" 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就需要写成 "\^" 和 "\$"。

    表达式

    可匹配

    \^

    匹配 ^ 符号本身

    \$

    匹配 $ 符号本身

    \.

    匹配小数点(.)本身

        这些转义字符的匹配方法与 "普通字符" 是类似的。也是匹配与之相同的一个字符。
    举例1:表达式 "\$d",在匹配字符串 "abc$de" 时,匹配结果是:成功;匹配到的内容是:"$d";匹配到的位置是:开始于3,结束于5。


    1.3 能够与 '多种字符' 匹配的表达式

        正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符。比如,表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。

    表达式

    可匹配

    \d

    任意一个数字,0~9 中的任意一个

    \w

    任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

    \s

    包括空格、制表符、换页符等空白字符的其中任意一个

    .

    小数点可以匹配除了换行符(\n)以外的任意一个字符

    举例1:表达式 "\d\d",在匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"12";匹配到的位置是:开始于3,结束于5。
    举例2:表达式 "a.\d",在匹配 "aaa100" 时,匹配的结果是:成功;匹配到的内容是:"aa1";匹配到的位置是:开始于1,结束于4。


    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。
    举例2:表达式 "[^abc]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"1";匹配到的位置是:开始于3,结束于4。


    1.5 修饰匹配次数的特殊符号

        前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。
        使用方法是:"次数修饰"放在"被修饰的表达式"后边。比如:"[bcd][bcd]" 可以写成 "[bcd]{2}"。

    表达式

    作用

    {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。
    举例2:表达式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 时,匹配的结果是:成功;匹配到的内容是:"goooooogle";匹配到的位置是:开始于7,结束于17。


    1.6 其他一些代表抽象意义的特殊符号

        一些符号在表达式中代表抽象的特殊意义:

    表达式

    作用

    ^

    与字符串开始的地方匹配,不匹配任何字符

    $

    与字符串结束的地方匹配,不匹配任何字符

    \b

    匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符

        进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。
    举例1:表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,比如:"aaa xxx xxx"
    举例2:表达式 "aaa$" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "$" 要求与字符串结束的地方匹配,因此,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,比如:"xxx xxx aaa"
    举例3:表达式 ".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。
        进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。
    举例4:表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。

        一些符号可以影响表达式内部的子表达式之间的关系:

    表达式

    作用

    |

    左右两边表达式之间 "或" 关系,匹配左边或者右边

    ( )

    (1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
    (2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

    举例5:表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时,匹配结果是:成功;匹配到的内容是:"Tom";匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack";匹配到的位置时:开始于15,结束于19。
    举例6:表达式 "(go\s*)+" 在匹配 "Let's go go go!" 时,匹配结果是:成功;匹配到内容是:"go go go";匹配到的位置是:开始于6,结束于14。
    举例7:表达式 "¥(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 时,匹配的结果是:成功;匹配到的内容是:"¥20.5";匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:"20.5"。


    2. 正则表达式中的一些高级规则
    2.1 匹配次数中的贪婪与非贪婪

        在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下:

    表达式

    匹配结果

    (d)(\w+)

    "\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

    (d)(\w+)(d)

    "\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"

        由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。

        非贪婪模式:
        在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:

    表达式

    匹配结果

    (d)(\w+?)

    "\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x"

    (d)(\w+?)(d)

    为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx"

        更多的情况,举例如下:
    举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。
    举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。


    2.2 反向引用 \1, \2...

        表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。
        其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。

        举例如下:
    举例1:表达式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 时,匹配结果是:成功;匹配到的内容是:" 'Hello' "。再次匹配下一个时,可以匹配到 " "World" "。
    举例2:表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。再次匹配下一个时,将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次,注意与 "\w{5,}" 之间的区别
    举例3:表达式 "<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。


    2.3 预搜索,不匹配;反向预搜索,不匹配

        前面的章节中,我讲到了几个代表抽象意义的特殊符号:"^","$","\b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的,更加灵活的表示方法。

        正向预搜索:"(?=xxxxx)","(?!xxxxx)"
        格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b",本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。
    举例1:表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。
    举例2:表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。

        格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。
    举例3:表达式 "((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时,将从头一直匹配到 "stop" 之前的位置,如果字符串中没有 "stop",则匹配整个字符串。
    举例4:表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时,只能匹配 "do"。在本条举例中,"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。

        反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"
        这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。
        举例5:表达式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空间,以及本站推荐的最简单易用的 DEELX 正则引擎


    3. 其他通用规则

        还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。

    3.1 表达式中,可以使用 "\xXX" 和 "\uXXXX" 表示一个字符("X" 表示一个十六进制数)

    形式

    字符范围

    \xXX

    编号在 0 ~ 255 范围的字符,比如:空格可以使用 "\x20" 表示

    \uXXXX

    任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示,比如:"\u4E2D"

    3.2 在表达式 "\s","\d","\w","\b" 表示特殊意义的同时,对应的大写字母表示相反的意义

    表达式

    可匹配

    \S

    匹配所有非空白字符("\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

    默认情况下,表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如:
    ①xxxxxxxxx②\n
    ③xxxxxxxxx④
    配置为 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

    清华大学校长顾秉林接受采访的新闻报道 --转载

    昨天下午,清华大学校长顾秉林先生在接受学生记者采访的时候,表达了他对现在大学教育状况的担心,他表示,说得直白一点,现行的大学教育制度就是“在往学生们的脑子里灌屎”。
    顾秉林校长表示,在二十世纪初至40年代,可以说是中国教育界的黄金时期,在这段时间以内中国的大学为社会培养出了大批的优秀人才,他们中有伟大的思想家、教育家,有革命义士、抗日英雄,有科学骨干、民族精英。而这种盛况自从解放后尤其是九十年代开始衰落。现在的各高校,包括清华与北大在内,已经没有将培养人才作为大学教育的目标。严重的学术腐败,枯燥且与社会脱节的课程,死记硬背的教育方式,将导致学生们的思想僵化,对课程失去兴趣,对大学乃至整个中国的教育失去信心,退学正是表达他们对大学教育失望的最极端方式。
    他进一步表示,至少有80%的学生在刚进入大学的时候是酬躇满志,报着努力学习的决心的,可是在四年大学生涯的消磨与侵蚀下,能将这一决心坚持到毕业的学生恐怕不到20%。逃课,考试作弊已经被很多学生当成了家常便饭。上大学的目的由最初的学习知识变成了纯粹的混文凭。而那些在恶劣的环境下坚持认真学习的学生,他们的学习能力和创新能力却正在被逐渐磨灭。若这种情况持续下去,大学最终培养出来的成品,将是一具具没有灵魂的行尸走肉。
    “如果一直这样下去,20年后,中国大学生的思想状态和精神水平将会是什么样子?我简直不敢想象!”
    古板的教学方式和教材让社会丢失了许多的达芬奇,比尔盖茨。对于这样损失,我们是否要反省下呢?在这样的教育模式之下,学生们的精神受到极大的伤害,创造性和独立思考能力受到无可挽回的扼杀,中国至今没有诺贝尔奖获得者,与这种教育模式有很大的关系。
    以下是顾秉林先生的原话:
    作为一个大学校长,我认为真正的高校应该培养学生的独立技能、独特的思考方式和敢于权威挑战的精神。
    1、什么是独立的技能?
    不是拘泥于课本上的,如果你对某东西有深入研究,可以考虑研究成果作为成绩。我们要鼓励和发扬这样的模式,因为市场和学生需要这样的鼓励!
    2、什么是独特的思考方式?
    独特的思考方式不代表爆炸式的思考,而是多种寻根问底的思想,抓住一条线一直往前摸,有这样的科学精神,这条线一定能通往诺贝尔。独特的思考方式是在不断学习的过程中产生的,学生得注意研究的方式、研究的目的以及合理性。当然,诺贝尔奖不应该成为教育的最终目标,教育的最终目标是为社会培养以及输送人才,但是这毕竟是国际上对最顶尖人才认可的标志。
    3、什么是敢于挑战权威?
    这个相信学生们都了解,羽毛和石头哪个能先着地?
    这个是众人皆知的,为什么那个时候全世界只有1个人提出了不相同的结论并用事实证明了?原因就是权威的威慑。教授:这个名词是一个长辈的名词,我不介意别人叫我同学,叫我兄弟,或者学生。因为弟子不必不如师,师不必贤于弟子,闻道有先后,术业有专攻。你研究的成果比老是的好,你就是老师,我可以为一个同学 “无聊”的问题而停下上课,动员大家参与这个问题的讨论,原因为什么?这个问题的隔壁很可能就是诺贝尔奖……
    当然,以上的能力,在中国现行的教育体制下,是不可能被赋予学生的。所以顾秉林先生表示,中国的高等教育体制改革势在必行,“应该停止再扼杀人才了!应该停止再向学生们的脑子里灌屎了!”当然,改革会涉及很多未知的因素,以及牵扯很多人的利益,势必受到极大的阻力,可是为了学生以及中国的未来着想,这些阻力都必须被克服。

    August 26

    MVC evolves: the Page Controller

    A somewhat different implementation of MVC has been popularized by frameworks
    like Microsoft’s ASP.NET1. Rather than have requests go through a dispatcher
    to look up a controller to execute, the view is hit directly and calls its controller
    before continuing to render. Although this pattern gives up some of the decoupled
    nature of a more classic MVC implementation, it should gain in productivity and
    tool support (especially in Microsoft Visual Studio).
    This type of development canalso be supported by WebWork by using the <webwork:action> custom tag (see
    chapter 9, “Tag libraries,” for a discussion of the WebWork tag library).

     

    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
    needs of your application.

    August 21

    随笔:国际惯例与中国国情对比表 --转载

    今天看到新京报的一条新闻: 《北京警方澄清虐杀狗传言 称入户宣传非入户查抄》,里面有段报道:“北京市农业局畜牧兽医处副处长王滨表示,目前他们主要是配合公安机关工作。他表示,按照相关规定,这次重点治理的九类犬,比如在重点管理区饲养大型犬、烈性犬;无证养犬;一户养多犬;流浪犬等。一旦无证犬被查获,将收容在犬类留检所。自收容之日起7日内无人认领、领养的,按照国际惯例处理。”

      当时一看,就吓了一跳,额的神,这个“国际惯例”还 ZTMNB。我只听说现在成天嚷嚷的银行卡收费、油价上涨、高薪养廉是国际惯例,什么时候,打狗行业也要引入国际惯例了?

      这些年,这两个词,大家都耳熟能详了,一个就是“国际惯例”,另一个就是“中国国情”。当对利益部门和垄断集团有利而对老百姓无利时,例如银行收费、油价上涨、高薪养廉、住房商业化等等时,他们就说,这是与国际结轨, 纷纷用“国际惯例”改进自己的工作,形成了一股采用“国际惯例”提价、涨价的热潮;与此同时,在涉及到老百姓切身利益的工资水平、医疗保障、电信收费、房价等种种不符合“国际惯例”的情况时,给民众的解释却是“要照顾中国国情”。

      倒底这国际惯例和中国国情,是个啥子东东呢?也许是自己技术人员的缘故, 凡事喜欢较真追求逻辑清楚,心想:何不列个表格出来,一一对比,看个清清楚楚?于是,我做花了一个晚上的时间,整理了下方的这个《国际惯例与中国国情对比表》。

      表格中的内容与数据,没有夹杂我的任何评论与个人观点。所有的数据、资料、观点、评论的资料,都有出处, 来源于下表中的40篇文章:

    数量 来源
    35篇 中国最权威最官方的新华通讯社新华网的报道
    1篇 163 网易新闻
    1篇 sina 的专题
    1篇 sohu 的专题
    1篇 出国留学网对其他国家的教育情况介绍
    1篇 上海教育科学研究院

      有鉴于本文最近一个星期在凯迪、文学城、新浪等大型媒体频繁转载,引起了较大的争论, 本人于 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

    项目事件 国际惯例 中国国情 资料数据出处
    中国各大银行根据“国际惯例”, 收取跨行查询费等30余项收费

    资金充足率:《巴塞尔协议》规定银行的资本充足率应当在 8% 以上.

    世界十大银行在 1999 年的资本充足率为 11.5%

    资金充足率: 中国国有商业银行资本充足率只有4.5% 新华通讯社之新华网:托辞“惯例”的中国银行离“惯例”有多远?

    工作效率

    员工人数:与中国银行资产规模相当的汇丰银行只有 3万多人

    人均利润: 花旗银行、德意志银行等金融机构的人均利润为 5万多美元

    净资产收益率: 花旗银行为 20% 左右,渣打银行为 14%

    工作效率

    员工人数:中国银行 20 多万人

    人均利润:国有商业银行大约只有1000 美元

    净资产收益率: 四大国有商业银行只有 3% 左右

    银行监管体系

    国际通行标准银行内部的稽核人员应占员工人数的5%

    银行监管体系

    中国金融系统中稽核人员的比例还不到1%

    跨行查询收费:

    跨行查询费根本不存在所谓的“国际惯例”。

    首先,并不是所有国家都收取这笔费用;

    其次,即使有这笔费用,在很多国家也是发生在银行之间,持卡人并不需要为此买单

    跨行查询收费:

    2006.05.18, 四大国有银行同时发出公告: 根据国际惯例,2006.06.01 之后,对跨行查询收取费用:

    境内查询费金额为0.3元人民币,境外查询费为每笔4元

    新华通讯社之新华网:跨行查询收费:哪来的国际惯例?

    新华通讯社之新华网:四大行6月起开收跨行查询费 消费者无可奈何

    医改市场化,医疗产业化 英国:全民公费医疗

    巴西:全民公费医疗

    日本:每个日本国民都要加入国民健康保险。国民看病交 30% 医疗费即可,剩下的 70% 由医院和居民所在的地方政府结算

    美国:2003年,美国当年的国民医疗总开支高达16790亿美元,占国内生产总值的15.3%。而在医疗总开支中,公共部门的投入,即由美国联邦政府、州政府和地方政府投入的经费,占到46%。假如把美国各级政府为医疗保障提供的税收减免也考虑进去,则公共投入所占的比重会超过60%

    郎感平说:医疗市场化后,导致医生看钱不看病,穷人生不起病,看不起病。

    2005年,国务院发展研究中心的《医疗卫生体制改革的报告》认为:总体讲医改是不成功的,其根源“在于商业化、市场化的走向违背了医疗卫生事业的基本规律”

    2005.10月卫生部表示:“卫生部从未表态说过医疗改革不成功,也不同意医疗改革不成功的说法

    新华通讯社之新华网: 郎咸平:医生看钱不看病, 市场化将毁医改教改

    新华通讯社之新华网: 国务院研究机构称我国医改工作基本不成功

    新华通讯社之新华网: 卫生部否认医改失败

    新华通讯社之新华网: 公私结合——普通移民眼中的美国医疗制度

    新华通讯社之新华网: 也谈美国的医疗制度

    国外医疗体制:日本国民看病不难 巴西全民免费

    机场建设费 国外大多数机场都不收取机杨建设费 在国内,即使使用了10多年的老机场,也照样收取机场建设费。乘客们得到的解释是:“这是中国国情”。

    新华通讯社之新华网:跨行查询收费:哪来的国际惯例?

    教育产业化

    大多数国家实行完全免费的义务教育。日本甚至提供免费的营养午餐。

    德国:实行12年制的义务教育,公立学校学费全免

    日本:二战失败后的日本,1947年《基本教育法》实施, 9年免费义务教育。1969年起实施完全免费的义务教育,从小学1年级至初中全体学生所用教科书免费供应。

    英国:英格兰、威尔士和苏格兰实行5~16岁义务教育制度,北爱地区实行4~16岁义务教育制度

    澳大利亚:中小学12年义务教育

    根据中国国情,国家财力不堪负担。育产业化把学生作为商品在盈利。

    大部分高等教育实行高收费, 全国都实现了普遍的收费“并轨”。从1980到2006的三代大学生,学费涨了100倍, 但人的收入并没有同步提高.

    20世纪末全国中小学有危房约1300万平方米,集中在中西部农村。

    中国教育工会调查,中国有2/3的省(自治区、直辖市)拖欠中小学教师工资,目前已累计拖欠 100多亿 (另一份数据: 2004年,全国政协的一份提案披露:我国现有公务用车约400万辆,每年耗资约 3000亿元,大约相当于国家为三峡工程投资的3倍)

    2006年, 江苏南京工业大学调查: 大学1年需要花费 1.1万元,江苏省统计局资料显示,2005年,江苏省农民人均纯收入不过 4239 元。这意味着三个农民才能供起一名在校大学生。

    新华通讯社之新华网:教育产业化”何时停止为害教育?

    新华通讯社之新华网: 中央党校调查: <中国农村九年义务教育的困境与出路>报告

    新华通讯社之新华网:三代大学生学费涨了100倍 政协委员现身说法痛击教育产业化

    新华通讯社之新华网:公车私用与法治精神

    留学出国网:德意志联邦共和国概况, 大不列颠及北爱尔兰联合王国概况, 澳大利亚联邦概况

    上海教育科学研究院:教育和人力资源是立国之本---美、日、韩追赶先进国家的历史经验

    搜狐财经聚焦:高等教育:农民的奢侈品?

    GDP 投入:

    世界平均: 4.2%

    韩国 1984年:13。3%

    加拿大 1998年: 6.16%

    澳大利亚 1998年: 5.46%

    美国 1998年: 6.43%

    美国 1999年: 7.1%

    美国 2000年: 7.0%

    中国 GDP 投入:

    2000年: 2.79%

    2001年: 3.19%

    2002年: 3.30%

    上海教育科学研究院:教育和人力资源是立国之本---美、日、韩追赶先进国家的历史经验

    言论:

    日本亚细亚大学委员长容应萸:“我不赞同‘教育产业化’,教育就是教育,教育就是培养人才!”

    韩国高丽大学校长表时烈: “教育产业化?我没听过。我不懂这个概念。”

    言论:

    国内一位市长表示:对高中阶段教育,今后政府不仅要“断奶”,而且要让学校创收,向财政上交 。

    郎咸平说:教育市场化, 剥夺穷人上学机会

    新华通讯社之新华网:教育可以“产业化”吗

    新华通讯社之新华网: 郎咸平:医生看钱不看病 市场化将毁医改教改

    国际惯例与中国国情对比表(二)

    http://www.xiaohui.com/weekly/20061115.htm

    项目事件 国际惯例 中国国情 资料数据出处
    国家实行房改,房价根据“国际惯例”,不断上涨 国际惯例:

    资本主义国家的居民确实都是自己买房子。

    国际惯例的背后:

    他们买房子的同时也买了地产,可永久继承

    房价与国际结轨。土地使用权参照“中国国情”: 中国土地国有, 实行“房地分离”,任何人不得买卖土地。购买房产,最多获取70年土地使用权

    新华通讯社之新华网:跟国际接轨, 比照巴黎北京合理房价是2134元

    高薪养廉 国际惯例:

    新加坡、香港高薪养廉

    国际惯例的背后:

    香港:拥有廉政公署,严厉的监管体系

    新加坡:严厉透明的监管体系

    2006年,政协委员张俐娜说:“司法和执法人员的工资水平低,是滋生‘司法不公’、‘执法不严’的温床”。

    公务员已经根据“国际惯例”三番五次加薪。但是,相应的监督机制却又因为“中国国情”依然滞后。

    新华通讯社之新华网政协委员热议:对执法人员以“高薪养廉”

    新华通讯社之新华网: 廉政保证金”难收其效

    燃油税 国际惯例:

    目前,世界发达国家普遍实施燃油税:美国对汽油征收30%的税率,93号汽油零售价格约为每升4.3元人民币;英国税率是73%,油价约为每升12.2元人民币;……

    国际惯例的背后:

    美国现拥有的8.9万公里高速公路,只有大约8000公里是收费路段,并且收得很少。在美国中西部地区,绝大多数公路甚至连收费站都没有

    中国国情

    各种税费名目多从: 养路费、车辆使用税、车船费、过桥费、

    全世界建有收费公路的国家与地区共有20多个,建有收费公路14万公里。在这14万公里收费公路中约有10万公里在我国.

    我国已建成公路中,高速公路的90%,一级公路的80%,二级公路的40%以上,都是收费公路.

    新华通讯社之新华网: 收费混乱的高价公路:地方得利 全局“输棋”

    新华通讯社之新华网: 开征燃油税谁获益? 谁吃亏?

    新华通讯社之新华网:本田老总:希望净化汽车消费市场减少额外费用

    新华通讯社之新华网: 我国将调整公路收费政策

    油价上涨 国际惯例

    国际原油价格执续上涨。

    国际惯例的背后

    世界无铅汽油的硫含量标准,不得大于0.02%; 烯烃含量不得大于20%

    为与国际结轨,国内油价紧跟国际原油价格上涨。

    中石化华北研究所的分析报告:相比世界无铅汽油的硫含量标准与烯烃含量标准,目前我国的汽、柴油质量与国际水平有着较大差距. 导致尾气排放量增加,增加了对环境的污染,而且对车辆造成了较大损伤,目前我国的汽车故障中有6%是油品问题直接引起的,有50%是间接由燃油质量问题引起的.

    车用无铅汽油抽样合格率为74.2%。其中,93 号车用无铅汽油近三成不合格

    新华通讯社之新华网:别让"国际惯例""中国国情"成利益集团牟利借口

    新华通讯社之新华网: 93号无铅汽油抽样合格率仅为74.2% 近三成不合格

    新华通讯社之新华网: 油价接轨矣!“油品”接轨乎?

    国际惯例的背后:

    2006.11, 财富杂志公布2006全球企业社会责任排名数据显示:

    英国石油公司 第22名

    荷兰皇家壳牌集团 第32名

    中国国情:

    中石油高喊: “国际原油价格上涨, 国内成品油价格跟不上国际油价的涨幅,企业亏损严重

    中国国情的背后:

    中石油自己公开2005年度业绩,公司以1333.6亿元净利润盖过日本丰田公司成为亚洲最赚钱的公司

    2006.11, 财富杂志公布2006全球企业社会责任排名数据显示:

    中石油排名63,名列倒数第二(倒数第一是的中国国家电网公司)。

    新华通讯社之新华网:中国石油一年净赚1756亿元

    高额利润引人关注

    新华通讯社之新华网:边喊亏边赚钱 中石油上半年净利润达616亿元

    新华通讯社之新华网:中石油 巨额利润愧不愧?

    网易新闻: 财富公布企业社会责任排名 中石油国家电网倒数

    国际原油价格在 2006.07.14 日后一路下跌 国际油价上涨时,国内油价紧跟“国际惯例”随其后连续上涨

    国际油价一路下跌,国内油价不降。说是“国情不同”

    新华通讯社之新华网: 跟涨不跟跌,涨价就是硬道理?

    飞机失事赔偿标准 国际惯例:

    2005.07.31, 《蒙特利尔公约》在中国正式生效,所有乘坐从中国内地出发的国际航班的乘客,万一发生伤亡,最高可以获赔109万元

    2002.05.07日北方航空大连失事,112人全部遇难。其中8名外国人的遇难家属,按“国际惯例”赔付15万美元

    中国国情:

    国内航班还是按“老规矩”,最高只能赔7万元,这一“老规矩”从定下之日起至今已10多年没动过。

    2002.05.07日北方航空大连失事,112人全部遇难。机上中国人按“中国国情”,每个赔付7万人民币,同时因为按人道主义精神增加6.3万元。共 13.3万人民币

    新华通讯社之新华网: 同样的伤亡不同的赔偿

    新浪专题:北方航空公司一客机在大连坠毁

    电信资费

    对于“取消月租费”和“实现单向收费”的强烈呼声,信息产业部电信经济专家委员会专家认为,收取月租费并不是因为缺钱,而是国际惯例

    国际惯例

    国际上大多采用“月租费+通话费”的收费模式

    国际惯例的背后:

    1. 没有收取初装费的惯例

    2. 按秒计费

    3. 单向收费

    4. 电信卡多数国家不设置有效期,余额可消费

    5. 人们用于电话消费的金额不到收入的5%

    6. 美国手机打国内长途和在本公司服务区内的全国漫游均没有附加费用,只有使用了另一家公司的网络服务才被视为真正的“漫游”而收取适当费用

    中国国情

    1.“技术原因”无法以秒计费

    2. 双向收费

    3. 收取初装费

    4. 电信卡余额不退, 使用有时间限制

    5. 中国人用于电话消费的金额达到了8%—10%

    6. 高额的漫游费

    新华通讯社之新华网: 月租费皮球还要踢多久

    新华通讯社之新华网:“价格战”究竟让谁“很受伤”?

    新华通讯社之新华网: 五电信运营商承诺取消霸王合同 月租费争议未决

    新华通讯社之新华网: 国外手机资费低,其实没有什么奥秘

    根据国际惯例机票超售

    乘客持有机票却无法登机,原因是一个航班只有200个座位,但航空公司却根据“国际惯例”销售出去205个座位.

    国际惯例:

    每次航班允许超售3%至5%

    国际惯例的背后:

    国外航空公司对于超售制定了非常完善的补偿措施,除改签其他航班外,还会为乘客提供机票优惠金钱补偿等措施,同时,往往在售票前就告知乘客为超售的机票,乘客可以选择是否购买

    中国国情:目前国内的航空公司采取的一般做法是改签下一航班或免费为乘客升舱.无超售补偿的具体规定;航空公司事先一般不告知乘客

    新华通讯社之新华网:乘客持有机票却无法登机 南航"超售"机票引诉讼

    银行不设厕所 没有在网上查到这个国际惯例 :)

    昆明一老人在银行排队时被尿憋晕,责问银行为何不设厕所,银行说这是跟国际接轨

    新华通讯社之新华网: 爱托辞“惯例”的中国银行离“惯例”有多远?

    感谢: 在整理本表格过程中, 得到阿达、Tian、xjb、扫地老僧 等朋友的帮助, 特表示谢意

    注意: 本文可自由转载。但是, 必须满足下列条件:

    1. 转载页面需要保留链接至本文地址: http://www.xiaohui.com/weekly/20061115.htm

    2. 必须全文完整转载。表格部分的内容必须以表格的形式或图片形式转载, 以保持表格对比的完整性。

    August 20

    JavaScript RegExp 对象参考手册

    RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。

    RegExp 对象的方法

    FF: Firefox, N: Netscape, IE: Internet Explorer

    方法 描述 FF N IE
    exec 检索字符串中指定的值。返回找到的值,并确定其位置。 1 4 4
    test 检索字符串中指定的值。返回 true 或 false。 1 4 4

    支持正则表达式的 String 对象的方法

    FF: Firefox, N: Netscape, IE: Internet Explorer

    方法 描述 FF N IE
    search 检索与正则表达式相匹配的值。 1 4 4
    match 找到一个或多个正在表达式的匹配。 1 4 4
    replace 替换与正则表达式匹配的子串。 1 4 4
    split 把字符串分割为字符串数组。 1 4 4

    RegExp 对象的属性

    属性 描述 FF N IE
    global RegExp 对象是否具有标志 g。 1 4 4
    ignoreCase RegExp 对象是否具有标志 i。 1 4 4
    lastIndex 一个整数,标示开始下一次匹配的字符位置。 1 4 4
    multiline RegExp 对象是否具有标志 m。 1 4 4
    source 正则表达式的源文本。 1 4 4
    August 19

    JavaScript Math 对象的参考手册

    Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(),像 Math.sin() 这样的函数只是函数,不是某个对象的方法。

    Math 对象的方法

    FF: Firefox, N: Netscape, IE: Internet Explorer

    方法 描述 FF N IE
    abs(x) 返回数的绝对值 1 2 3
    acos(x) 返回数的反余弦值 1 2 3
    asin(x) 返回数的反正弦值 1 2 3
    atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值 1 2 3
    atan2(y,x) 返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间) 1 2 3
    ceil(x) 对一个数进行上舍入。 1 2 3
    cos(x) 返回数的余弦 1 2 3
    exp(x) 返回 e 的指数。 1 2 3
    floor(x) 对一个数进行下舍入。 1 2 3
    log(x) 返回数的自然对数(底为e) 1 2 3
    max(x,y) 返回 x 和 y 中的最高值 1 2 3
    min(x,y) 返回 x 和 y 中的最低值 1 2 3
    pow(x,y) 返回 x 的 y 次幂 1 2 3
    random() 返回 0 ~ 1 之间的随机数 1 2 3
    round(x) 把一个数四舍五入为最接近的整数 1 2 3
    sin(x) 返回数的正弦 1 2 3
    sqrt(x) 返回数的平方根 1 2 3
    tan(x) 返回一个角的正切 1 2 3
    toSource() 代表对象的源代码 1 4 -
    valueOf() 返回一个 Math 对象的原始值 1 2 4

    Math 对象的属性

    FF: Firefox, N: Netscape, IE: Internet Explorer

    属性 描述 FF N IE
    constructor 对创建此对象的函数的引用 1 2 4
    E 常量 e,自然对数的底数 (约等于2.718) 1 2 3
    LN2 返回 2 的自然对数(约等于0.693) 1 2 3
    LN10 返回 10 的自然对数(约等于2.302) 1 2 3
    LOG2E 返回以 2 为底的 e 的对数 (约等于 1.414) 1 2 3
    LOG10E 返回以 10 为底的 e 的对数 (约等于0.434) 1 2 3
    PI 返回圆周率 (约等于3.14159) 1 2 3
    prototype 允许您向对象添加属性和方法 1 2 4
    SQRT1_2 返回 2 的平方根除 1 (约等于 0.707) 1 2 3
    SQRT2 返回 2 的平方根 (约等于 1.414) 1 2 3

    JavaScript Boolean 对象的参考手册

    Boolean 对象是 JavaScript 的一种基本数据类型。

    Boolean 对象是一个把布尔值打包的布尔对象。

    Boolean 对象的方法

    FF: Firefox, N: Netscape, IE: Internet Explorer

    方法 描述 FF N IE
    toSource() 代表对象的源代码 1 4 -
    toString() 把逻辑值转换为字符串,并返回结果。 1 4 4
    valueOf() 返回 Boolean 对象的原始值 1 4 4

    Boolean 对象的属性

    FF: Firefox, N: Netscape, IE: Internet Explorer

    属性 描述 FF N IE
    constructor 对创建此对象的函数的一个引用 1 2 4
    prototype 允许您向对象添加属性和方法 1 2 4

    JavaScript Array 对象的参考手册

    Array 对象的方法

    FF: Firefox, N: Netscape, IE: Internet Explorer

    方法 描述 FF N IE
    concat() 连接两个或更多的数组,并返回结果。 1 4 4
    join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 1 3 4
    pop() 删除并返回数组的最后一个元素 1 4 5.5
    push() 向数组的末尾添加一个或更多元素,并返回新的长度。 1 4 5.5
    reverse() 颠倒数组中元素的顺序。 1 3 4
    shift() 删除并返回数组的第一个元素 1 4 5.5
    slice() 从某个已有的数组返回选定的元素 1 4 4
    sort() 对数组的元素进行排序 1 3 4
    splice() 删除元素,并向数组添加新元素。 1 4 5.5
    toSource() 代表对象的源代码 1 4 -
    toString() 把数组转换为字符串,并返回结果。 1 3 4
    toLocaleString() 把数组转换为本地数组,并返回结果。 1 3 4
    unshift() 向数组的开头添加一个或更多元素,并返回新的长度。 1 4 6
    valueOf() 返回数组对象的原始值 1 2 4

    Array 对象的属性

    FF: Firefox, N: Netscape, IE: Internet Explorer

    属性 描述 FF N IE
    constructor 对创建此对象的函数的一个引用 1 2 4
    index   1 3 4
    input   1 3 4
    length 设置或返回数组中元素的数目。 1 2 4
    prototype 使您有能力向对象添加属性和方法 1 2 4

    JavaScript Array 对象的参考手册

    Array 对象的方法

    FF: Firefox, N: Netscape, IE: Internet Explorer

    方法 描述 FF N IE
    concat() 连接两个或更多的数组,并返回结果。 1 4 4
    join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 1 3 4
    pop() 删除并返回数组的最后一个元素 1 4 5.5
    push() 向数组的末尾添加一个或更多元素,并返回新的长度。 1 4 5.5
    reverse() 颠倒数组中元素的顺序。 1 3 4
    shift() 删除并返回数组的第一个元素 1 4 5.5
    slice() 从某个已有的数组返回选定的元素 1 4 4
    sort() 对数组的元素进行排序 1 3 4
    splice() 删除元素,并向数组添加新元素。 1 4 5.5
    toSource() 代表对象的源代码 1 4 -
    toString() 把数组转换为字符串,并返回结果。 1 3 4
    toLocaleString() 把数组转换为本地数组,并返回结果。 1 3 4
    unshift() 向数组的开头添加一个或更多元素,并返回新的长度。 1 4 6
    valueOf() 返回数组对象的原始值 1 2 4

    Array 对象的属性

    FF: Firefox, N: Netscape, IE: Internet Explorer

    属性 描述 FF N IE
    constructor 对创建此对象的函数的一个引用 1 2 4
    index   1 3 4
    input   1 3 4
    length 设置或返回数组中元素的数目。 1 2 4
    prototype 使您有能力向对象添加属性和方法 1 2 4

    JavaScript Date 对象参考手册

    Date 对象是 JavaScript 的一种内部数据类型。

    Date 对象没有可以直接读写的属性,所有对日期和时间值的访问都是通过其方法执行的。

    请从下面的表格访问有关 Date 对象的方法的详细信息。

    Date 对象的方法

    FF: Firefox, N: Netscape, IE: Internet Explorer

    方法 描述 FF N IE
    Date() 返回当日的日期和时间 1 2 3
    getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31) 1 2 3
    getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6) 1 2 3
    getMonth() 从 Date 对象返回月份 (0 ~ 11) 1 2 3
    getFullYear() 从 Date 对象以四位数字返回年份 1 4 4
    getYear() 从 Date 对象以两位或四位数字返回年份。 1 2 3
    getHours() 返回 Date 对象的小时 (0 ~ 23) 1 2 3
    getMinutes() 返回 Date 对象的分钟 (0 ~ 59) 1 2 3
    getSeconds() 返回 Date 对象的秒数 (0 ~ 59)) 1 2 3
    getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999) 1 4 4
    getTime() 返回 1970 年 1 月 1 日至今的毫秒数 1 2 3
    getTimezoneOffset() 返回本地时间与格林威治标准时间的分钟差 (GMT) 1 2 3
    getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31) 1 4 4
    getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6) 1 4 4
    getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11) 1 4 4
    getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份 1 4 4
    getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23) 1 4 4
    getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59) 1 4 4
    getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59) 1 4 4
    getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999) 1 4 4
    parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒数 1 2 3
    setDate() 设置 Date 对象中月的某一天 (1 ~ 31)) 1 2 3
    setMonth() 设置 Date 对象中月份 (0 ~ 11)) 1 2 3
    setFullYear() 设置 Date 对象中的年份(四位数字) 1 4 4
    setYear() 设置 Date 对象中的年份(两位或四位数字)。 1 2 3
    setHours() 设置 Date 对象中的小时 (0 ~ 23) 1 2 3
    setMinutes() 设置 Date 对象中的分钟 (0 ~ 59) 1 2 3
    setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59) 1 2 3
    setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999) 1 4 4
    setTime() 通过向或从1970年1月1日午夜添加或减去指定数目的毫秒来计算日期和时间 1 2 3
    setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31) 1 4 4
    setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11) 1 4 4
    setUTCFullYear() 根据世界时设置 Date 对象中年份(四位数字) 1 4 4
    setUTCHours() 根据世界时设置 Date 对象中小时 (0 ~ 23) 1 4 4
    setUTCMinutes() 根据世界时设置 Date 对象中分钟 (0 ~ 59) 1 4 4
    setUTCSeconds() 根据世界时设置 Date 对象中秒钟 (0 ~ 59) 1 4 4
    setUTCMilliseconds() 根据世界时设置 Date 对象中毫秒S(0 ~ 999) 1 4 4
    toSource() 代表对象的源代码 1 4 -
    toString() 把 Date 对象转换为字符串。 1 2 4
    toTimeString() 把 Date 对象的时间部分转换为字符串。 1 2 4
    toDateString() 把 Date 对象的日期部分转换为字符串。 1 2 4
    toGMTString() 根据格林威治时间,把 Date 对象转换为字符串。 1 2 3
    toUTCString() 根据世界时,把 Date 对象转换为字符串。 1 4 4
    toLocaleString() 根据本地时间格式,把 Date 对象转换为字符串。 1 2 3
    toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串 1 2 3
    toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串 1 2 3
    UTC() 根据世界时,获得一个日期,然后返回1970年1月1日午夜到该日期的毫秒数。 1 2 3
    valueOf() 返回 Date 对象的原始值。 1 2 4

    Date 对象的属性

    FF: Firefox, N: Netscape, IE: Internet Explorer

    属性 描述 FF N IE
    constructor 一个对创建对象的函数的引用 1 4 4
    prototype 使您有能力向对象添加属性和方法 1 3 4

    JavaScript String 对象参考手册

    字符串是 JavaScript 的一种基本的数据类型。

    String 对象的 length 属性声明了该字符串中的字符数。String 类定义了大量操作字符串的方法。

    需要注意的是,JavaScript 的字符串是不可变的,String 类定义的方法都不能改变字符串的内容。

    String 对象的方法

    FF: Firefox, N: Netscape, IE: Internet Explorer

    方法 描述 FF N IE
    anchor() 创建 HTML 锚。 1 2 3
    big() 用大号字体显示字符串。 1 2 3
    blink() 显示闪动字符串。 1 2  
    bold() 使用粗体显示字符串。 1 2 3
    charAt() 返回在指定位置的字符。 1 2 3
    charCodeAt() 返回在指定的位置的字符的 Unicode 编码。 1 4 4
    concat() 连接字符串。 1 4 4
    fixed() 以打字机文本显示字符串。 1 2 3
    fontcolor() 使用指定的颜色来显示字符串。 1 2 3
    fontsize() 使用指定的尺寸来显示字符串。 1 2 3
    fromCharCode() 从字符编码创建一个字符串。 1 4 4
    indexOf() 检索字符串。 1 2 3
    italics() 使用斜体显示字符串。 1 2 3
    lastIndexOf() 从后向前搜索字符串。 1 2 3
    link() 将字符串显示为链接。 1 2 3
    localeCompare() 用本地特定的顺序来比较两个字符串。 1 4 4
    match() 找到一个或多个正在表达式的匹配。 1 4 4
    replace() 替换与正则表达式匹配的子串。 1 4 4
    search() 检索与正则表达式相匹配的值。 1 4 4
    slice() 提取字符串的片断,并在新的字符串中返回被提取的部分。 1 4 4
    small() 使用小字号来显示字符串。 1 2 3
    split() 把字符串分割为字符串数组。 1 4 4
    strike() 使用删除线来显示字符串。 1 2 3
    sub() 把字符串显示为下标。 1 2 3
    substr() 从起始索引号提取字符串中指定数目的字符。 1 4 4
    substring() 提取字符串中两个指定的索引号之间的字符。 1 2 3
    sup() 把字符串显示为上标。 1 2 3
    toLocaleLowerCase() 把字符串转换为小写。 - - -
    toLocaleUpperCase() 把字符串转换为大写。 - - -
    toLowerCase() 把字符串转换为小写。 1 2 3
    toUpperCase() 把字符串转换为大写。 1 2 3
    toSource() 代表对象的源代码。 1 4 -
    toString() 返回字符串。 - - -
    valueOf() 返回某个字符串对象的原始值。 1 2 4

    String 对象的属性

    FF: Firefox, N: Netscape, IE: Internet Explorer

    属性 描述 FF N IE
    constructor 对创建该对象的函数的引用 1 4 4
    length 字符串的长度 1 2 3
    prototype 允许您向对象添加属性和方法 1 2 4
    August 18

    JavaScript

    当页面载入时,会执行位于 body 部分的 JavaScript。

    当被调用时,位于 head 部分的 JavaScript 才会被执行。

    实例

    head 部分
    包含函数的脚本位于文档的 head 部分。这样我们就可以确保在调用函数前,脚本已经载入了。
    body 部分
    执行位于 body 部分的脚本。
    外部 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
    在 XML 中提交 ID 属性的字符串 (仅与 schema 属性一同使用)

    IDREF
    在 XML 中提交 IDREF 属性的字符串(仅与 schema 属性一同使用)

    IDREFS language
    包含合法的语言 id 的字符串

    Name
    包含合法 XML 名称的字符串

    NCName

    NMTOKEN
    在 XML 中提交 NMTOKEN 属性的字符串 (仅与 schema 属性一同使用)

    NMTOKENS

    normalizedString
    不包含换行符、回车或制表符的字符串

    QName

    string
    字符串

    token
    不包含换行符、回车或制表符、开头或结尾空格或者多个连续空格的字符串

    对字符串数据类型的限定(Restriction)

    可与字符串数据类型一同使用的限定:

    • enumeration
    • length
    • maxLength
    • minLength
    • pattern (NMTOKENS、IDREFS 以及 ENTITIES 无法使用此约束)
    • whiteSpace
    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"/>
          <xs:any minOccurs="0"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>

    现在,我们希望使用 "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="http://www.microsoft.com family.xsd
    http://www.w3school.com.cn children.xsd">
    
    <person>
    <firstname>David</firstname>
    <lastname>Smith</lastname>
    <children>
      <childname>mike</childname>
    </children>
    </person>
    
    <person>
    <firstname>Tony</firstname>
    <lastname>Smith</lastname>
    </person>
    
    </persons>

    上面这个 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" 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="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>
        <xs:extension base="personinfo">
          <xs:sequence>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>

     

    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" type="carType"/>
    
    <xs:simpleType name="carType">
      <xs:restriction base="xs:string">
        <xs:enumeration value="Audi"/>
        <xs:enumeration value="Golf"/>
        <xs:enumeration value="BMW"/>
      </xs:restriction>
    </xs:simpleType>

    注释:在这种情况下,类型 "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
    定义所允许的最大的小数位数。必须大于等于0。

    length
    定义所允许的字符或者列表项目的精确数目。必须大于或等于0。

    maxExclusive
    定义数值的上限。所允许的值必须小于此值。

    maxInclusive
    定义数值的上限。所允许的值必须小于或等于此值。

    maxLength
    定义所允许的字符或者列表项目的最大数目。必须大于或等于0。

    minExclusive
    定义数值的下限。所允许的值必需大于此值。

    minInclusive
    定义数值的下限。所允许的值必需大于或等于此值。

    minLength
    定义所允许的字符或者列表项目的最小数目。必须大于或等于0。

    pattern
    定义可接受的字符的精确序列。

    totalDigits
    定义所允许的阿拉伯数字的精确位数。必须大于0。

    whiteSpace
    定义空白字符(换行、回车、空格以及制表符)的处理方式。

    XSD 属性

    所有的属性均作为简易类型来声明。

    什么是属性?

    简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

    如何声明属性?

    定义属性的语法是:
    <xs:attribute name="xxx" type="yyy"/>

    在此处,xxx 指属性名称,yyy 则规定属性的数据类型。XML Schema 拥有很多内建的数据类型。

    最常用的类型是:
    • xs:string
    • xs:decimal
    • xs:integer
    • xs:boolean
    • xs:date
    • xs:time
    实例

    这是带有属性的 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 拥有很多内建的数据类型。

    最常用的类型是:
    • xs:string
    • xs:decimal
    • xs:integer
    • xs:boolean
    • xs:date
    • xs:time
    例子:

    这是一些 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"/>