javaBean: 符合特定规则的java类
javaBean分两种
狭义: 私有字段,对外提供访问方法,setter getter
广义: 私有字段,对外提供访问方法,setter getter,任意数量的公有业务方法
内省(IntroSpector) 站在反射的角度:
java提供一些操作javaBean的api
PropertyDescriptor 属性描述类
getWriteMethod(); setter
getReadMethod(); getter
IntroSpector
通过getBeanInfo()方法获取javaBean类的属性;
在通过属性描述类PropertiesDescriptors,进行setter,getter操作
getWriteMethod(); setter
getReadMethod(); getter
属性与getter有关,与setter无关,
//证明 删除setter 删除字段
getter方法必须有返回值
任何一个javaBean都有一个class属性,因为继承Object的,用于父类的getClass();
第二个字母小写,则单词字母小写
BeanUtils工具包
简化内省操作代码书写,内部String与基本类型的自动转换
//使用BeanUtil操作javaBean, Date类的级联
Converutils转换器
通过register()方法,向BeanUtils注册自定义转换器
匿名内部类实现Converter子类, 并复写convert()方法
//自定义转换器Data 转 字符串
SimpleDataFormat简单日期格式化类
使用format()方法
Date类的toLocalString(); 将日期转换为本地显示方式
BeanUtils内置提供了一些常用的转换器,就是Converter的子类
泛型(Generic) 常用于集合
将运行发生的类型转换异常,转移到了编译时期,提高了安全性.同时也避免了强制转换的麻烦
编译之后产生的class文件不会保留泛型信息,这种操作称为:擦除,
<> 念 type of
ArrayList<E> E称为类型参数变量
ArrayList<Integer> Integer称为实际类型参数
ArrayList<E> 泛型类型
ArrayList<Integer> 参数化类型
ArrayList 原始类型
泛型类型参数变量必须为引用类型
//Map泛型取出元素,List泛型进行迭代元素
BigDecimal大精度
泛型两边要么都不加泛型,要么两边的约束类型都要一直,同时也必须是引用类型
泛型中不存在继承
原始类型可以赋值给参数化类型,反之也行,这样目的是为了兼容1.4
切记,面向接口,面向父类编程,提高程序的扩展性以及后期维护性
//自定义泛型方法 实现两个元素的交换 使用Integer int测试
当一个类有大量的泛型属性或者泛型方法,那么就可以将该类定义为泛型类
//泛型类
注意:static方法不能使用泛型类的类型的
? 不确定的类型
可以匹配任意类型,但是在方法内不能调用与类型相关的方法,可以用Object接收任意类型
? 常用于引用对象
限定符
上限: ? extends Number 只能接收Numebr或者Number的子类
下限: ? super Number 只能接收Number或者Number的父类
String是final的,不可以继承
W3C 2000年发布的XML1.0规范
为什么要学习xml?
需要使用xml通知计算机程序去处理关系数据
xml技术除用于保存关系数据外,它还常用于软件配置文件,已描述程序模板间的关系,还当一个小型数据库或者数据载体
保存xml文件时,一定要确保xml文件与保存的编码和encoding声明的编码一致或者兼容
xml语法:
一个xml文件分为以下几个部分:
1.文档声明
2.元素
3.属性(附加的信息描述)
4.注释(不能随意嵌套)
5.CDATA(特殊字符)
6.处理指令(processing instraction)
1.文档声明
enCoding 指定字符编码
version 指定xml版本
standalone 指定xml文件是否独立 可设置"yes" or "no"
各浏览器的xml解析器只是对xml的语法检测
2.元素
元素指xml文件中出现的标签
一个标签为开始标签,和结束标签.
可以包含标签体:
<a>www.nima.com</a>
不包含标签体:<a></a> 可以简写<a/>
允许嵌套若干个子标签,但不允许交叉嵌套(html可以)
<a><b></a></b> //这是不允许的
并且只有一个根节点(标签)
程序会将标签的内容空白字符当做有效的字符
命名规范:
1.区分大小写,例如<p>与<P>是两个不同的标签
2.不能以数字或_开头
3.不能以xml Xml XML开头
4.不能包含空格
5.名称中不能包含(:冒号)
3.属性
1.一个标签可以有多个属性,每个属性都有它的子集的名称和取值
例如: <input name="text">
2.属性值一定要用双引号或单引号引起来,就是定界符
3.定义属性必须循环与元素一样的命名规范
当一个事物必须与该对象绑定在一起,没有该对象,该事物就没有意义,此时该事物就应成为对象的属性,不可变化的
4.注释
<!-- 注释 -->
注意:注释之间不存在嵌套
5.CDATA(character data(字符数据区/段))
作用时:不让该字符数据区/段不让xml解析器解析
<![CDATA[
//代码区/段
]]>
CDATA不允许嵌套
xml内置5中转义字符:
< <
> >
& &
" "
' '
其他字符可以查看编码表:
例如 ¥¥ 注意&#x是必须的 且x必须小写
6.处理指令
<?xml-stylesheet type="text/css" href="#">
//使用css控制xml的样式 css叠层样式表
作用:
1.可以使用css装饰xml文件文件中的内容
2.css目前版本只能支持英文标签
约束
什么是xml约束?
在xml技术里,可以编写一个文档来约束一个xml文档的书写规范,这称为xml约束
为什么需要约束?
为了解析器唯一对待一种xml文件
DTD(Document Type Definetion)文档类型定义
<!DOCTYPE 根标签 SYSTEM "dtd文件">
//xml 人 姓名 年龄 DTD约束
#PCDATA (paraser character data)文本字符数据
正确的xml文件是指xml语法正确
有效的xml文件是指xml语法和约束都正确
编写DTD有两种方式:
1.外部约束 定义在外部 在用<!DOCTYPE>进行引用就可以
2.内部约束 通常定义在第二行
<!DOCTYPE 跟标签 [
]>
SYSTEM 是个人或者组织,小范围内使用的. 本地
PUBLIC 是大范围内使用的,例如structs框架 公共的
DTD约束语法细节:
1.元素定义
<!ELEMENT 元素名称 元素内容(元素类型)>
元素内容或类型则使用()括起来,用空格与元素名称隔开
如果是空标签,直接使用EMPTY
例如:<!ELMENT name EMPTY> 那么这时name元素内容就必须为空,可以</name>使用
ANY代表任意类型的元素,可以放字标签,#PCDATA,与空元素
在实际开发中,尽量使用EMPTY,少用ANY
在DTD中,必须将所有的标签全部声明完,少一个都不允许
可以使用|分隔,表示任选其一
可以用+(出现一次或多次), ?(出现0次或一次) , *(出现一次或多次)等符号表示元素出现的次数
批量处理
例如<!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL)* | COMMENT)>
2.属性定义
1.xml中为元素通过ATTLIST进行属性设置
语法
<!ATTLIST 元素名
属性名 属性值类型 值约束
>
//车 生产日期 品牌 轮胎数
#REQUIRED 属性必须出现
#IMPLIED 属性可有可无
#FIXED 属性设置必须为固定值
还可以设置默认值,属性不设置也是具备默认的.如果创建属性那么可以重新赋值,例如
width CDATA "10";
属性的类型:
1.CDATA 普通文本字符串
2.ENUMERATE 枚举 例如(5 | 6 | 7)
3.ID 唯一类型 值不能以字母,下划线开始,不能出现空格,而且是唯一的,约束为@REQUIRED
4.ENTITY 替代了频繁出现的字符串
实体用于一段内容创建一个别名,以后再xml文档中就可以使用别名引用这段内容了.
实体分: 引用实体 和 参数实体
引用实体:
语法:
<!ENTITY 实体名称 "内容">
引用方式:
&实体名称;
参数实体:
<!ENTITY % 实体名称 "元素名">
使用方式:
<!ELMENT 元素名 (%实体名) >
注意:参数实体,是要定义外部DTD的
参数实体: 当定义DTD时,出现相同的子元素,此时可以使用参数实体来解决,在DTD中定义,在在DTD中使用
引用实体: 当定义xml时,很多子元素有相同的内容,这时可以使用实体,在DTD声明,在xml中使用
//第三个练习 报纸
javaBean分两种
狭义: 私有字段,对外提供访问方法,setter getter
广义: 私有字段,对外提供访问方法,setter getter,任意数量的公有业务方法
内省(IntroSpector) 站在反射的角度:
java提供一些操作javaBean的api
PropertyDescriptor 属性描述类
getWriteMethod(); setter
getReadMethod(); getter
IntroSpector
通过getBeanInfo()方法获取javaBean类的属性;
在通过属性描述类PropertiesDescriptors,进行setter,getter操作
getWriteMethod(); setter
getReadMethod(); getter
package day02;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//简单内省 复杂内省
public class IntroSpectorTest1
{
public static void main(String[] args)throws Exception
{
Person p = new Person("a",11);
String propertyName = "age";
setProperety(p, propertyName);
getProperty(p, propertyName);
}
private static void getProperty(Person p, String propertyName) throws IntrospectionException,
IllegalAccessException, InvocationTargetException
{
/*
PropertyDescriptor pd = new PropertyDescriptor(propertyName, p.getClass());
Method method = pd.getReadMethod();
method.invoke(p);
*/
//复杂内省操作
BeanInfo bi = Introspector.getBeanInfo(p.getClass());
PropertyDescriptor[] pd = bi.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : pd)
{
if(propertyDescriptor.getName().equals(propertyName))
{
Method method = propertyDescriptor.getReadMethod();
System.out.println(method.invoke(p));
}
}
}
private static void setProperety(Person p, String propertyName) throws IntrospectionException,
IllegalAccessException, InvocationTargetException
{
/*
PropertyDescriptor pd = new PropertyDescriptor(propertyName, p.getClass());
Method method = pd.getWriteMethod();
method.invoke(p,60 );
*/
//复杂的内省操作
BeanInfo bi = Introspector.getBeanInfo(p.getClass());
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : pds)
{
if(propertyDescriptor.getName().equals(propertyName))
{
Method method = propertyDescriptor.getWriteMethod();
method.invoke(p,90 );
}
}
}
}
属性与getter有关,与setter无关,
//证明 删除setter 删除字段
package day02;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
//javaBean测试
public class JavaBeanTest
{
public static void main(String[] args)throws Exception
{
Person p = new Person("a",10);
BeanInfo bi = Introspector.getBeanInfo(p.getClass());
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : pds)
{
System.out.println(propertyDescriptor.getName());
}
//类中定义name age
//class 是继承Object的getClass
//S 是 getS()方法
//所以getter方法只要返回值,可以没有setter与字段
}
}
getter方法必须有返回值
任何一个javaBean都有一个class属性,因为继承Object的,用于父类的getClass();
第二个字母小写,则单词字母小写
BeanUtils工具包
简化内省操作代码书写,内部String与基本类型的自动转换
//使用BeanUtil操作javaBean, Date类的级联
package day02;
import org.apache.commons.beanutils.BeanUtils;
//使用Beanutils工具包操作javaBean
public class BeanUtilsTest
{
public static void main(String[] args)throws Exception
{
Person person = new Person("a",15);
String name = "age";
String str = BeanUtils.getProperty(person, name);
System.out.println(person);
BeanUtils.setProperty(person, name, 90);
System.out.println(person);
//属性级联
String date = BeanUtils.getProperty(person, "date.time");
System.out.println(date);
}
}
Converutils转换器
通过register()方法,向BeanUtils注册自定义转换器
匿名内部类实现Converter子类, 并复写convert()方法
//自定义转换器Data 转 字符串
SimpleDataFormat简单日期格式化类
使用format()方法
Date类的toLocalString(); 将日期转换为本地显示方式
BeanUtils内置提供了一些常用的转换器,就是Converter的子类
//使用内置的转换器 DateConverter, DateLocalConverter等
package day02;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
//ConvertUtils自定义转换器
public class ConverutilsTest
{
public static void main(String[] args)throws Exception
{
Person person = new Person("静儿",50);
String date = "date";
//BeanUtils内置的 如DateLocalConvertor
//ConvertUtils.register(new DateLocaleConverter(), Date.class);
//自定义的日期转换
ConvertUtils.register(new Converter()
{
@SuppressWarnings("unchecked")
@Override
//目标字节码文件 还有传进来的参数
public <T> T convert(Class<T> arg0, Object arg1)
{
String time = (String) arg1;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try
{
return (T)sdf.parse(time);
} catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}, Date.class); //要转换的字节码文件对象
BeanUtils.setProperty(person, date, "2014-4-15");
String str = BeanUtils.getProperty(person, date);
System.out.println(str);
}
}
泛型(Generic) 常用于集合
将运行发生的类型转换异常,转移到了编译时期,提高了安全性.同时也避免了强制转换的麻烦
编译之后产生的class文件不会保留泛型信息,这种操作称为:擦除,
<> 念 type of
ArrayList<E> E称为类型参数变量
ArrayList<Integer> Integer称为实际类型参数
ArrayList<E> 泛型类型
ArrayList<Integer> 参数化类型
ArrayList 原始类型
泛型类型参数变量必须为引用类型
//Map泛型取出元素,List泛型进行迭代元素
package day02;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
//泛型 用于Map集合 List集合
public class Generic
{
public static void main(String[] args)
{
//注意 如果底层是哈希表数据结构,那么在进行删除的操作的时候,不能对参与哈希值运算的字段进行修改
//这样删除元素就会失败
Map<Integer, String> map = new HashMap<Integer,String>();
map.put(1, "a");
map.put(2, "c");
map.put(3, "c");
map.put(4, "d");
for (Map.Entry<Integer, String> me : map.entrySet())
{
System.out.println(me.getKey()+""+me.getValue());
}
List<String> list = new ArrayList<String>();
list.add("nima");
list.add("kengdie");
//如果想在迭代的时候,还要添加元素的话 就要List特有的迭代器listIterator
ListIterator<String> li = list.listIterator();
while(li.hasNext())
{
System.out.println(li.next());
li.add("aaa");
}
System.out.println(list);
}
}
BigDecimal大精度
泛型两边要么都不加泛型,要么两边的约束类型都要一直,同时也必须是引用类型
泛型中不存在继承
原始类型可以赋值给参数化类型,反之也行,这样目的是为了兼容1.4
切记,面向接口,面向父类编程,提高程序的扩展性以及后期维护性
//自定义泛型方法 实现两个元素的交换 使用Integer int测试
package day02;
import java.util.Arrays;
//自定义泛型方法
public class GenericTest
{
public static void main(String[] args)
{
int[] arr = {1,2,3,4};
String[] strs = {"a","b"};
//print(arr); //不能传基本类型数组
print(strs);
// swap(arr, 0, 1); //不能传基本类型数组
swap(strs, 0, 1);
System.out.println(Arrays.toString(strs));
}
public static <T>void print(T[] t)
{
System.out.println(t);
}
public static <T>void swap(T[] arr,int i, int j)
{
T temp = arr[i];
arr[i] = arr[j];
arr[j] =temp;
}
}
当一个类有大量的泛型属性或者泛型方法,那么就可以将该类定义为泛型类
//泛型类
注意:static方法不能使用泛型类的类型的
package day02;
//字定义泛型类
public class GenericTest1<T>
{
private T t;
public void show(T t)
{
System.out.println(t);
}
//静态方法不能访问泛型类
public static <T>void print(T t)
{
System.out.println(t);
}
public static void main(String[] args)
{
GenericTest1<String> g = new GenericTest1<String>();
g.show("fff");
g.print(10);
g.print("a");
}
}
? 不确定的类型
可以匹配任意类型,但是在方法内不能调用与类型相关的方法,可以用Object接收任意类型
? 常用于引用对象
限定符
上限: ? extends Number 只能接收Numebr或者Number的子类
下限: ? super Number 只能接收Number或者Number的父类
String是final的,不可以继承
package day02;
import java.util.ArrayList;
import java.util.List;
//泛型通配符的使用
public class GenericTest2
{
public static void main(String[] args)
{
List<Integer> list = new ArrayList<Integer>();
list.add(10);
list.add(105);
list.add(108);
list.add(150);
show(list);
//上限 只能接收Number的子类以及Number
List<? extends Number> l = new ArrayList<Integer>();
//下限 只能接收Integer 或者Integer的父类
List<? super Integer> x = new ArrayList<Number>();
}
//?通配符 表示任何任意类型 常用于参数类型引用
public static void show(List<?> list)
{
// list.add(10); //不可以调用与该类型有关的如添加等操作
list.remove(0);
System.out.println(list.size());
}
}
package day02;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
//反转集合
public class Reverse
{
public static void main(String[] args)
{
List<Integer> list = new ArrayList<Integer>();
list.add(15);
list.add(14);
//反转前
System.out.println(list);
//反转后
Collections.reverse(list);
System.out.println(list);
}
}
W3C 2000年发布的XML1.0规范
为什么要学习xml?
需要使用xml通知计算机程序去处理关系数据
xml技术除用于保存关系数据外,它还常用于软件配置文件,已描述程序模板间的关系,还当一个小型数据库或者数据载体
保存xml文件时,一定要确保xml文件与保存的编码和encoding声明的编码一致或者兼容
xml语法:
一个xml文件分为以下几个部分:
1.文档声明
2.元素
3.属性(附加的信息描述)
4.注释(不能随意嵌套)
5.CDATA(特殊字符)
6.处理指令(processing instraction)
1.文档声明
enCoding 指定字符编码
version 指定xml版本
standalone 指定xml文件是否独立 可设置"yes" or "no"
各浏览器的xml解析器只是对xml的语法检测
2.元素
元素指xml文件中出现的标签
一个标签为开始标签,和结束标签.
可以包含标签体:
<a>www.nima.com</a>
不包含标签体:<a></a> 可以简写<a/>
允许嵌套若干个子标签,但不允许交叉嵌套(html可以)
<a><b></a></b> //这是不允许的
并且只有一个根节点(标签)
程序会将标签的内容空白字符当做有效的字符
命名规范:
1.区分大小写,例如<p>与<P>是两个不同的标签
2.不能以数字或_开头
3.不能以xml Xml XML开头
4.不能包含空格
5.名称中不能包含(:冒号)
3.属性
1.一个标签可以有多个属性,每个属性都有它的子集的名称和取值
例如: <input name="text">
2.属性值一定要用双引号或单引号引起来,就是定界符
3.定义属性必须循环与元素一样的命名规范
//描述一个家庭 编号,地址,邮编
当一个事物必须与该对象绑定在一起,没有该对象,该事物就没有意义,此时该事物就应成为对象的属性,不可变化的
4.注释
<!-- 注释 -->
注意:注释之间不存在嵌套
5.CDATA(character data(字符数据区/段))
作用时:不让该字符数据区/段不让xml解析器解析
<![CDATA[
//代码区/段
]]>
CDATA不允许嵌套
xml内置5中转义字符:
< <
> >
& &
" "
' '
其他字符可以查看编码表:
例如 ¥¥ 注意&#x是必须的 且x必须小写
6.处理指令
<?xml-stylesheet type="text/css" href="#">
//使用css控制xml的样式 css叠层样式表
作用:
1.可以使用css装饰xml文件文件中的内容
2.css目前版本只能支持英文标签
@CHARSET "UTF-8";
root
{
color:#060;
font-size: 50px;
}
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet type="text/css" href="main.css" ?>
<root>
<family id="0001">
<address>广东</address>
<show><</show>
<show>></show>
<show>&</show>
<show>"</show>
<show>'</show>
<!-- 查看编码转换 ¥ 字符编码 &#x 引用 -->
<show>¥</show>
<zipcode/>
<!-- 注释: 标签允许若干次嵌套 -->
<city name = "湛江">
<ju>霞山</ju>
</city>
</family>
<!-- 被CDATA注释的数据区/段 不参与编译 -->
<![CDATA[
<family id="0002">
<address>广西</address>
</family>
]]>
</root>
约束
什么是xml约束?
在xml技术里,可以编写一个文档来约束一个xml文档的书写规范,这称为xml约束
为什么需要约束?
为了解析器唯一对待一种xml文件
DTD(Document Type Definetion)文档类型定义
<!DOCTYPE 根标签 SYSTEM "dtd文件">
//xml 人 姓名 年龄 DTD约束
#PCDATA (paraser character data)文本字符数据
正确的xml文件是指xml语法正确
有效的xml文件是指xml语法和约束都正确
编写DTD有两种方式:
1.外部约束 定义在外部 在用<!DOCTYPE>进行引用就可以
2.内部约束 通常定义在第二行
<!DOCTYPE 跟标签 [
]>
SYSTEM 是个人或者组织,小范围内使用的. 本地
PUBLIC 是大范围内使用的,例如structs框架 公共的
DTD约束语法细节:
1.元素定义
<!ELEMENT 元素名称 元素内容(元素类型)>
元素内容或类型则使用()括起来,用空格与元素名称隔开
如果是空标签,直接使用EMPTY
例如:<!ELMENT name EMPTY> 那么这时name元素内容就必须为空,可以</name>使用
ANY代表任意类型的元素,可以放字标签,#PCDATA,与空元素
在实际开发中,尽量使用EMPTY,少用ANY
在DTD中,必须将所有的标签全部声明完,少一个都不允许
可以使用|分隔,表示任选其一
可以用+(出现一次或多次), ?(出现0次或一次) , *(出现一次或多次)等符号表示元素出现的次数
批量处理
例如<!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL)* | COMMENT)>
2.属性定义
1.xml中为元素通过ATTLIST进行属性设置
语法
<!ATTLIST 元素名
属性名 属性值类型 值约束
>
//车 生产日期 品牌 轮胎数
#REQUIRED 属性必须出现
#IMPLIED 属性可有可无
#FIXED 属性设置必须为固定值
还可以设置默认值,属性不设置也是具备默认的.如果创建属性那么可以重新赋值,例如
width CDATA "10";
属性的类型:
1.CDATA 普通文本字符串
2.ENUMERATE 枚举 例如(5 | 6 | 7)
3.ID 唯一类型 值不能以字母,下划线开始,不能出现空格,而且是唯一的,约束为@REQUIRED
4.ENTITY 替代了频繁出现的字符串
实体用于一段内容创建一个别名,以后再xml文档中就可以使用别名引用这段内容了.
实体分: 引用实体 和 参数实体
引用实体:
语法:
<!ENTITY 实体名称 "内容">
引用方式:
&实体名称;
参数实体:
<!ENTITY % 实体名称 "元素名">
使用方式:
<!ELMENT 元素名 (%实体名) >
注意:参数实体,是要定义外部DTD的
参数实体: 当定义DTD时,出现相同的子元素,此时可以使用参数实体来解决,在DTD中定义,在在DTD中使用
引用实体: 当定义xml时,很多子元素有相同的内容,这时可以使用实体,在DTD声明,在xml中使用
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT students (student+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA) | EMPTY>
<!--<!ELEMENT age EMPTY>-->
<!--<!ELEMENT age ANY> -->
<!ATTLIST student sid CDATA #REQUIRED> <!-- 必须实现-->
<!ATTLIST name alias CDATA #IMPLIED> <!-- 可有可无-->
<!ATTLIST name alias FIXED "九卿"> <!-- 固定值-->
<!ATTLIST name alias CDATA "九卿"> <!-- 默认值-->
<!ATTLIST name alias ID #REQUIRED> <!-- ID属性类型-->
<!ATTLIST name alias (纸|那只) "纸"> <!-- 枚举类型-->
<!ATTLIST name alias CDATA "123"> <!-- CDATA基本文本数据类型-->
<!ENTITY entity "helloworld"> <!-- 内容实体 引用&entity;-->
<!ENTITY % tcp "name">
<!ATTLIST student (%tcp;) >
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "stu.dtd">
<students>
<student sid = "20">
<name></name>
<age>18</age>
</student>
<student>
<name></name>
<age>18</age>
</student>
</students>
//电视频道 第一练习
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TVSCHEDULE SYSTEM "dianshi.dtd">
<TVSCHEDULE NAME="坑爹">
<CHANNEL CHAN="第一">
<BANNER></BANNER>
<DAY>
<DATE></DATE>
<HOLIDAY></HOLIDAY>
<HOLIDAY></HOLIDAY>
<PROGRAMSLOT >
<TIME ></TIME>
<TITLE ></TITLE>
</PROGRAMSLOT>
</DAY>
</CHANNEL>
<CHANNEL CHAN="第二">
<BANNER></BANNER>
<DAY>
<DATE></DATE>
<HOLIDAY></HOLIDAY>
<PROGRAMSLOT VTR="可有可无">
<TIME ></TIME>
<TITLE RATING ="可有可无" LANGUAGE="可有可无"></TITLE>
<DESCRIPTION></DESCRIPTION>
</PROGRAMSLOT>
</DAY>
</CHANNEL>
</TVSCHEDULE>
//产品 第二个练习
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ELEMENT OPTIONS (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">
<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>
<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte"
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">
<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>
<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE CATALOG SYSTEM "chanpin.dtd">
<CATALOG>
<PRODUCT NAME ="可有可无" CATEGORY ="Table" PARTNUM="可有可无" PLANT="Chicago" INVENTORY="Discontinued">
<SPECIFICATIONS WEIGHT="可有可无" POWER="可有可无"></SPECIFICATIONS>
<OPTIONS FINISH ="Polished" ADAPTER="Included" CASE= "NotApplicable"></OPTIONS>
<PRICE MSRP="可有可无" WHOLESALE ="可有可无" STREET = "可有可无" SHIPPING ="可有可无"></PRICE>
<NOTES>&AUTHOR;&COMPANY;&EMAIL;</NOTES>
</PRODUCT>
<PRODUCT >
<SPECIFICATIONS ></SPECIFICATIONS>
<OPTIONS ></OPTIONS>
<PRICE ></PRICE>
<NOTES>&AUTHOR;&COMPANY;&EMAIL;</NOTES>
</PRODUCT>
</CATALOG>
//第三个练习 报纸
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE NEWSPAPER SYSTEM "baozhi.dtd">
<NEWSPAPER >
<ARTICLE AUTHOR="作者" EDITOR="可有可无" DATE ="可有可无" EDITION ="可有可无">
<HEADLINE>&NEWSPAPER;</HEADLINE>
<BYLINE></BYLINE>
<LEAD></LEAD>
<BODY>&PUBLISHER;</BODY>
<NOTES>©RIGHT;</NOTES>
</ARTICLE>
<ARTICLE AUTHOR="作者">
<HEADLINE>&NEWSPAPER;</HEADLINE>
<BYLINE></BYLINE>
<LEAD></LEAD>
<BODY>&PUBLISHER;</BODY>
<NOTES>©RIGHT;</NOTES>
</ARTICLE>
</NEWSPAPER>