XML中关于DTD类型(内部(SYSTEM)的和外部(PUBLIC)的区别)

DTD是什么?Document Type Definition——文档类型定义。

在做自定义标签的时候,写标签库定义文件tld时,要写一大段东东:<!DOCTYPE ...... >。当时只知道拷贝、粘贴,也没有去想这是什么东西。今天才知道,这玩意儿叫DTD。是为了规范xml文档元素编写的。

DTD的语法规定,DTD的所有关键字都是大写的,如DOCTYPE,ELEMENT等,它分为两种。

1、内部DTD。注意的是在元素名后面一定要有空格,否则就不是格式良好的
<!DOCTYPE 根元素名 [
<!ELEMENT 元素名 (元素类型定义)>
]>

如对下面这个xml文档的类型定义:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE poem [
<!ELEMENT poem (title,author,line+)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT line (#PCDATA)>
]>
<poem>
<title>静夜思</title>
<author>李白</author>
<line>床前明月光,</line>
<line>疑事地上霜.</line>
<line>举头望明月,</line>
<line>低头思故乡.</line>
</poem>

2、外部DTD
如果吧DTD放在xml文档内部,一方面会带来xml文档变大,一些程序可能不需要DTD信息;另一方面不利于DTD共用,也许会有不同的xml文档共用这个DTD。这就是外部DTD存在的原因。

定义外部DTD的语法:
<!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URI">(SYSTEM表示DTD文件是私有的。引号不能少)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="simple1.css" type="text/css" ?>
<!-- 外部DTD -->
<!DOCTYPE poem SYSTEM "poem.dtd">

<poem>
<title>静夜思</title>
<author>李白</author>
<line>床前明月光,</line>
<line>疑事地上霜.</line>
<line>举头望明月,</line>
<line>低头思故乡.</line>
<commet>李白是中国最伟大的诗人!</commet>
</poem>
-----------------------------相同目录下的poem.dtd内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT poem (title,author,line+,commet)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT line (#PCDATA)>
<!ELEMENT commet (#PCDATA)>

如果想引用一个公共的DTD文档,又该如何呢?
<!DOCTYPE 根元素名 PUBLIC "DTD的名称" "外部DTD文件的URI">(PUBLIC表示DTD文件是公共的,注意在PUBLIC之后,还多了一个DTD的名称。引号不能少)
下面是taglib的DTD:
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
分析一下这个外部DTD声明:
1、关键字DOCTYPE,PUBLIC。
2、根元素名:taglib。所以每一个标签库定义文件都是以taglib为根元素的,否则就不会验证通过。
3、紫色的字"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN",这是公共DTD的名称。这个东西命名是有些讲究的。首先它是以"-"开头的,表示这个DTD不是一个标准组织制定的。(如果是ISO标准化组织批准的,以“ISO”开头,如果不是ISO的标准化组织批准的,以“+”开头。)。接着就是双斜杠“//”,跟着的是DTD所有者的名字,很明显这个DTD是sun公司定的。接着又是双斜杠“//”,然后跟着的是DTD描述的文档类型,可以看出这份DTD描述的是jsp 标签库1.2版本的格式。再跟着的就是“//”和ISO 639语言标识符。
4、绿色的字"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd",表示这个DTD的位置。
疑问:是不是xml分析器都会到java.sun.com上去找这个dtd呢?答案是否定的,xml分析器首先会以某种机制查找公共DTD的名称,查到了,则以此为标准,如果查不到,再到DTD位置上去找。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。首先有两点是需要肯定的:   第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会;   第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高。不要害怕和逃避,毕竟我们还年轻。   本文共分五大部分。分别是XML快速入门,XML的概念,XML的术语,XML的实现,XML的实例分析。最后附录介绍了XML的相关资源。作者站在普通网页设计人员的角度,用平实生动的语言,向您讲述XML的方方面面,帮助你拨开XML的神秘面纱,快速步入XML的新领域。 • 第一章:XML快速入门 • 一. 什么是XML? • 二. XML是新概念吗? • 三. 使用XML有什么好处? • 四. XML很难学吗? • 五. XML和HTML的区别 • 六. XML的严格格式 • 七. 关于XML的更多 • 第二章:XML概念 • 一. 扩展性 • 二. 标识 • 三. 语言 • 四. 结构化 • 五. Meta数据 • 六. 显示 • 七. DOM • 第三章:XML的术语 • 导言 • 一.XML文档的有关术语 • 二.DTD的有关术语 • 第四章:XML的语法 • 一.XML语法规则 • 二.元素的语法 • 三.注释的语法 • 四.CDATA的语法 • 五.Namespaces的语法 • 六.entity的语法 • 七.DTD的语法 • 第五章:XML实例解释 • 一.定义新标识 • 二.建立XML文档 • 三.建立相应的HTML文件 • 第六章:XML相关资源 五. XML和HTML的区别 XML和HTML都来自于SGML,它们都含有标记,有着相似的语法,HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如表示首行标题,有固定的尺寸。相对的,XML则没有固定的标记,XML不能描述网页具体的外观,内容,它只是描述内容的数据形式和结构。 这是一个质的区别:网页将数据和显示混在一起,而XML则将数据和显示分开来。 我们看上面的例子,在myfile.htm,我们只关心页面的显示方式,我们可以设计不同的界面,用不同的方式来排版页面,但数据是储存在myfile.xml,不需要任何改变。 (如果你是程序员,你会惊讶的发现,这与模块化面向对象编程的思想极其相似!其实网页何尝不是一种程序呢?) 正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的数据处理方法,将使网络跨越到一个新的境界。 六. XML的严格格式 吸取HTML松散格式带来的经验教训,XML一开始就坚持实行"良好的格式"。 我们先看HTML的一些语句,这些语句在HTML随处可见: 1. sample 2.sample 3.sample 4.samplar 在XML文档,上述几种语句的语法都是错误的。因为: 1.所有的标记都必须要有一个相应的结束标记; 2.所有的XML标记都必须合理嵌套; 3.所有XML标记都区分大小写; 4.所有标记的属性必须用""括起来; 所以上列语句在XML正确的写法是 1. sample 2.sample 3.sample 4.samplar   另外,XML标记必须遵循下面的命名规则: 1.名字可以包含字母、数字以及其它字母; 2.名字不能以数字或"_" (下划线) 开头; 3.名字不能以字母 xml (或 XMLXml ..) 开头; 4.名字不能包含空格。 在XML文档任何的差错,都会得到同一个结果:网页不能被显示。各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都会被报告。你可以将上面的myfile.xml修改一下,比如将改为,然后用IE5直接打开myfile.xml,会得到一个出错信息页面: XML轻松学习手册 ajie <E
以下是一个示例mapper.xml模板配置: ```xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mapper.UserMapper"> <!-- 查询用户信息 --> <select id="selectUserById" resultType="com.example.entity.User"> SELECT * FROM user WHERE id = #{id} </select> <!-- 根据条件查询用户列表 --> <select id="selectUserList" resultType="com.example.entity.User"> SELECT * FROM user <where> <if test="name != null and name != ''"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select> <!-- 新增用户 --> <insert id="insertUser" parameterType="com.example.entity.User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> <!-- 更新用户信息 --> <update id="updateUser" parameterType="com.example.entity.User"> UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update> <!-- 删除用户 --> <delete id="deleteUserById" parameterType="int"> DELETE FROM user WHERE id = #{id} </delete> </mapper> ``` 在这个示例,我们定义了一个命名空间为`com.example.mapper.UserMapper`的mapper文件。在该命名空间,我们定义了五个操作: - `selectUserById`:根据用户id查询用户信息。 - `selectUserList`:根据条件查询用户列表。 - `insertUser`:新增用户。 - `updateUser`:更新用户信息。 - `deleteUserById`:根据用户id删除用户。 其,`selectUserList`演示了使用`<where>`和`<if>`标签来动态拼接SQL条件。 在MyBatis,我们可以通过`SqlSessionFactory`和`SqlSession`来使用mapper.xml定义的操作。例如: ```java SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 查询用户信息 User user = userMapper.selectUserById(1); System.out.println(user); // 查询用户列表 List<User> userList = userMapper.selectUserList("张三", null); System.out.println(userList); // 新增用户 User newUser = new User("李四", 25); userMapper.insertUser(newUser); sqlSession.commit(); // 更新用户信息 newUser.setName("王五"); userMapper.updateUser(newUser); sqlSession.commit(); // 删除用户 userMapper.deleteUserById(newUser.getId()); sqlSession.commit(); ``` 在这个示例,我们先通过`SqlSessionFactoryBuilder`来构建`SqlSessionFactory`,然后通过`SqlSession`来获取mapper接口的代理实现类。通过代理实现类,我们可以直接调用mapper.xml定义的方法,并传入适当的参数。最后,在执行完所有操作后,我们需要通过`sqlSession.commit()`来提交事务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值