跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

技巧: 使用 XML Schema Standard Type Library 简化开发

使用模式定义简化例程验证

Nicholas Chase 曾经参与多家公司的网站开发,包括 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers。Nick 曾经做过高中物理教师、低放射性废弃设备管理员、在线科幻杂志的编辑、多媒体工程师、Oracle 教员以及一家交互通信公司的首席技术官。他出版了多部著作,包括 XML Primer Plus (Sams)。

简介: XML 验证让您能够创建复杂规则以定义可接受的数据。但是如果您不使用这些规则,那么它们就毫无用处。在本文中,您将学习使用 XML Schema Standard Type Library 简化获取格式化数据(如电子邮件地址和电话号码)的过程。

查看本系列更多内容

发布日期: 2007 年 9 月 27 日
级别: 初级
访问情况 : 2455 次浏览
评论: 


本文假定您熟悉 XML 并至少对 XML Schema 有一定程度的了解。文中的示例将使用 XForms,但不强制要求了解 XForms。(如果您想要运行示例,可下载针对 Firefox 的 XForms 扩展。 )

验证 XML 或确保满足基于类型的某些限制是语言自身所固有的能力;Document Type Definitions 是 XML 规范的一部分。不久之后,对更高灵活性和更强功能的需求逐渐明显,从而产生了 XML Schema。XML Schema 使您能够创建具有很多特殊指定的定义。您可以指定元素必须包含特定数量的附加元素,或属性必须包含 datetime 值,文本符合某种模式,或任何其他结构。

例如,考虑以下 XForms 表单(参见清单 1)。


清单 1. 基本表单
                
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml"       
      xmlns:xforms="http://www.w3.org/2002/xforms"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<head>
    <title>Contact Form</title>

    <xforms:model>

       <xforms:instance id="content">
          <contact xmlns="">
             <name />
             <email />
             <phone />
          </contact>
       </xforms:instance>

       <xforms:submission id="submitContact" method="post" 
                                             action="." />

    </xforms:model>

    <link href="gen_default.css" rel="stylesheet"/> 

</head>
<body>

    <h1 align="center">Contact information</h1>

    <xforms:input ref="/contact/name">
        <xforms:label>Name: </xforms:label>
    </xforms:input>
    <br />
    <xforms:input ref="/contact/email">
        <xforms:label>Email: </xforms:label>
    </xforms:input>
    <br />
    <xforms:input ref="/contact/phone">
        <xforms:label>Phone: </xforms:label>
    </xforms:input>
    <br />
    <xforms:submit submission="submitContact">
       <xforms:label>Submit</xforms:label>	
    </xforms:submit>
</body>
</html>

此表单很简单,只是查找用户的姓名、电子邮件地址和电话号码,如图 1 所示。


图 1. 表单
表单

在本例中,将电子邮件或电话号码的条目约束为有效的电子邮件或电话号码 — 或者至少将其约束为正确的形式,都会有所帮助。为此,您需要向文档添加模式(见清单 2)。


清单 2. 添加模式
                
...

    <xforms:model>

         <xsd:element name="contact">
            <xsd:complexType>
               <xsd:element name="name" xsd:type="xsd:string" />
               <xsd:element name="email" />
               <xsd:element name="phone" />
            </xsd:complexType>
         </xsd:element>

       </xsd:schema>

       <xforms:instance id="content">
          <contact xmlns="">
             <name />
             <email />
             <phone />
          </contact>
       </xforms:instance>
...

然后您可以添加事件,用以在条目无效时告知用户(见 源代码 中的使用方法)。

注意,此时电子邮件和电话号码定义没有附带类型。原因是大多数程序员都不愿意卷入检查类型的麻烦。电子邮件地址有多种格式,但是有一种标准格式。同样,电话号码的形式也花样繁多,如 “带区号”、“不带区号”、“带分机号” 等等,并且这还不包括国家区号。

谁愿意去做所有的这些工作?反正我不愿意。所幸的是,存在电话号码或电子邮件地址的常见类型库。您可以从 http://www.codesynthesis.com/projects/xsstl/ 下载 XML schema standard type library。导入正确的名称空间和文档即可将该库添加到模式中(见清单 3)。


清单 3. 导入模式定义
                
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml"       
      xmlns:ev="http://www.w3.org/2001/xml-events"
      xmlns:xforms="http://www.w3.org/2002/xforms"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:stl="http://www.codesynthesis.com/xmlns/xsstl">

<head>
    <title>Contact Form</title>

    <xforms:model>

       <xsd:schema targetNamespace=""
            xmlns:stl="http://www.codesynthesis.com/xmlns/xsstl">

         <xsd:import 
            namespace="http://www.codesynthesis.com/xmlns/xsstl"
            schemaLocation="xsstl.xsd"/>

         <xsd:element name="contact">
            <xsd:complexType>
               <xsd:element name="name" xsd:type="xsd:string" />
               <xsd:element name="email" xsd:type="stl:EmailAddress" />
               <xsd:element name="phone" xsd:type="stl:PhoneNumber" />
            </xsd:complexType>
         </xsd:element>

       </xsd:schema>

       <xforms:instance id="content">
          <contact xmlns="">
             <name />
             <email />
             <phone />
          </contact>
       </xforms:instance>

       <xforms:bind nodeset="/contact/email"
		 type="stl:EmailAddress"/>

       <xforms:bind nodeset="/contact/phone"
		 type="stl:PhoneNumber"/>

       <xforms:submission id="submitContact" method="post" 
                                             action="." />
...

您可以在任意模式文档中使用此处介绍的技术,而不仅仅是嵌入 XForms 表单中的文档。确保定义了正确的名称空间别名(在本例中是 stl:),并导入实际的名称空间和模式文档。然后您可以像使用任何其他模式定义类型那样使用这些类型。在本例中,表单使用 EmailAddressPhoneNumber 类型。

此示例中导入了主文档,使所有的类型都可用。但是,您可以只导入实际需要的文档。XML Schema Standard Type Library 包含了几个单一类型的文档:

  • email-address.xsd:EmailAddress 类型约束数据为标准的电子邮件地址。
  • percentage.xsd:Percentage 类型表示从 0 到 100 之间的数字(包括 0 和 100)。
  • iso3166-country-code.xsd:ISO3166CountyCode 类型约束数据为两个字母的字符串并且要求其必须为一个实际的 ISO 3166-1 国家区号。
  • rfc822-date-time.xsd:RFC822DateTime 类型要求数据格式符合 RFC822 的指定要求。

其他文档包含了单一类型的变体:

  • ipv4-address.xsd:此文件包含了一个适当端点的变体,比如 IPv4AddressPortIPv4Endpoint,表示一个适当的 IP 地址(使用 dot 表示法)和一个端口。还包含了 IPv4EndpointStruct,它是一个结构体类型数据而不是单个字符串。
  • phone-number.xsd:此文档指定电话号码的各个部分 PhoneCountryCodePhoneAreaCodePhoneSubscriberNumberPhoneExtensionNumber,以及 PhoneNumber(它是将上述四者全部组合起来的一个字符串并至少需要一个订阅号)和 PhoneNumberStruct(将各个部分分隔到单个元素中的结构体)。
  • us-state-code.xsd:此文档包含了 “US state” 定义的几个变体,包括 USStateTerritoryCode(包含 50 个州和 9 个美国海外属地)、USStateCode(只针对州和华盛顿特区)、USTerritoryCode(只针对行政区,如美属维尔京群岛,不包含华盛顿特区)、USContinentalStateCode(所有的除夏威夷外的州,外加华盛顿特区)和 USContiguousStateCode(所有除夏威夷和阿拉斯加之外的州,外加华盛顿特区)。

结束语

XML Schema Standard Type Library 是创建模块定义以简化开发的一个示例。当您将它们导入到自己的模式中后,您就可以直接使用这些类型而无需亲自定义。



下载

描述名字大小下载方法
示例代码x-tipxsslt-source.zip1KBHTTP

关于下载方法的信息


参考资料

学习

  • 您可以参阅本文在 developerWorks 全球网站上的 英文原文

  • XML Schema validation in Xerces-Java 2(Nicholas Chase,developerWorks,2002 年 7 月):了解 XML Schema 和通过 Xerces-Java 2.0 使用模式验证的过程。

  • XForms 简介,第 1 部分: 新的 Web 表单标准(Chris Herborth,developerWorks,2006 年 12 月):这篇文章介绍了 XForms 的实际工作原理并展示了如何在 Microsoft Internet Explorer 和 Firefox 中设置 XForms,以便查看 XForms 示例。

  • XML Schema Recommendation:阅读 XML Schema 实用程序以及如何使用 XML Schema 语言创建模式。

  • XForms Recommendation:了解 XHTML 表单及其三个部分 —XForms 模型、示例数据和用户界面— 以分离内容和表示、允许重用、减少服务器往返、提供设备独立性并减少脚本编写。

  • IBM XML 认证:了解如何才能成为一名 IBM 认证的 XML 和其他相关技术的开发人员。

  • XML 技术文档库:查看 developerWorks XML 专区,获取大量的技术文章、技巧、教程、标准以及 IBM 红皮书。

  • developerWorks 技术事件和网络广播:随时关注技术的最新进展。

  • 技术书店:浏览关于这些主题和其他技术主题的书籍。

获得产品和技术

讨论

关于作者

Nicholas Chase 曾经参与多家公司的网站开发,包括 Lucent Technologies、Sun Microsystems、Oracle 和 Tampa Bay Buccaneers。Nick 曾经做过高中物理教师、低放射性废弃设备管理员、在线科幻杂志的编辑、多媒体工程师、Oracle 教员以及一家交互通信公司的首席技术官。他出版了多部著作,包括 XML Primer Plus (Sams)。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=258753
ArticleTitle=技巧: 使用 XML Schema Standard Type Library 简化开发
publish-date=09272007
author1-email=ibmquestions@nicholaschase.com
author1-email-cc=dwxed@us.ibm.com

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。