XMl概述
xml是可扩展的标记语言。它的标签都是自定义的,然后通过程序员写代码自己进行解析。
html的标签是预定义好的,每一个标签都有特定含义,这些标签可以被浏览器直接识别。
xml一般用来作为配置文件使用,它可以表示具有层次结构的数据。
xml标签的规则
1.标签都有由一对尖括号组成的
2.标签一般都是成对出现的,开始标签和结束标签的名称是一样的
<student></student>
3.标签可以是单独的一个标签,必须要有结束标签
<student/>
4.标签可以写属性,由属性名和属性值组成
<student name="zhagnsan" ></student>
5.标签可以嵌套,不能交叉
<student>
<name>zhagnsan</name>
<age>20</age>
</student>
xml文件的格式
1.xml文件的头部
<?xml version="1.0" encoding="UTF-8" ?>
2.一个xml文件有且只有一个根标签
3.类似于<>的特殊字符,需要用特殊符号代替
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
4.CDATA区:把需要显示的数据用CDATA区来表示,就不会当做xml的标签进行解析
![CDATA[内容]] // 用的得不多
<?xml version="1.0" encoding="utf-8" ?>
<students>
<student id="1">
<name>张三</name>
<age>18</age>
</student>
<student id="2">
<name>李四</name>
<age>20</age>
</student>
</students>
Dom4J解析xml
1.导入dom4j.jar文件
1)在模块下面新建一个libs文件夹
2)把dom4j.jar文件,复制到libs文件夹下
3)选中dom4j.jar右键Add As Library2.使用dom4j解析xml文件 (查看dom4j提供的文档,来写代码)
public class XmlParse {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("day17\\xml\\students.xml"));
//获取根标签 <students>
Element rootElement = document.getRootElement();
//获取根标签下面的子标签 <student>
List<Element> list = rootElement.elements("student");
List<Student> students=new ArrayList<>();
for (Element element : list) {
//获取<student>的id属性的值
String id = element.attribute("id").getValue();
//获取<student>的子标签<name>
String name = element.element("name").getText();
//获取<student>的子标签<age>
String age = element.element("age").getText();
//把获取到的id、name和age封装尾Student对象
Student stu=new Student(id,name,Integer.parseInt(age));
//把Student对象添加到集合
students.add(stu);
}
for (Student student : students) {
System.out.println(student);
}
}
}
DTD约束
约束是用来限定xml的标签可以写那些内容
<!ELEMENT students (student)+>
<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students SYSTEM 'students.dtd' >
<students>
<student>
<name>张三</name>
<age>18</age>
</student>
<student>
<name>李四</name>
<age>20</age>
</student>
</students>
Schema约束
Schema是用来约束xml的一种约束文件,Schema本身也是一个xml格式的文件。
新建schema文件students.xsd
<!--xml的文档标记-->
<?xml version="1.0"?>
<!--固定写法,表示Schema受到w3c的约束-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
<!--目标的命名空间,schmea文件作用在哪个xml文件中,可以通过命名空间来指定-->
targetNamespace="http://www.itheima.com"
xmlns="http://www.w3school.com.cn"
<!--表示schema是一个完整的文件-->
elementFormDefault="qualified">
<!--表示根元素-->
<xs:element name="students">
<!--表示元素是一个复杂元素-->
<xs:complexType>
<xs:element name="student">
<!--表示元素是一个复杂元素-->
<xs:complexType>
<!--表示元素是有顺序-->
<xs:sequence>
<!--表示子元素name,数据类型是strings-->
<xs:element name="name" type="xs:string"/>
<!--表示子元素age,数据类型是strings-->
<xs:element name="age" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:complexType>
</xs:element>
</xs:schema>
引入schema文件
<?xml version="1.0"?>
<students
xmlns="http://www.itheima.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itheima.com students.xsd">
<student>
<name>张三</name>
<age>18</age>
</student>
<student>
<name>李四</name>
<age>20</age>
</student>
</students>
枚举
枚举是一种特殊的类,枚举类的对象是固定的几种,所以以枚举项的形式罗列出来,每一个枚举项其实就是一个对象。
1.枚举的本质是一个类,每一个枚举项都是该类的对象
2.枚举类都是继承Enum类的,Eunm类的方法每一个枚举项都能调用
3.枚举类的构造方法都是私有的,目的是不能让别人创建对象
4.枚举类中可以写自己的构造方法,但是枚举项需要加括号,括号里面要写参数(用得少)
public enum Week {
//写7个Week的对象
// public static final Week SUNDAY=new Week("星期日");
// public static final Week MONDAY=new Week("星期一");
// public static final Week TUESDAY=new Week("星期二");
// public static final Week WEDNESDAY=new Week("星期三");
// public static final Week THURSDAY=new Week("星期日");
// public static final Week FRIDAY=new Week("星期五");
// public static final Week SATURDAY=new Week("星期六");
//把前面7个Week对象改成枚举项,每一个枚举项就表示一个Week的对象
SUNDAY("星期日"), //0
MONDAY("星期一"), //1
TUESDAY("星期二"), //2
WEDNESDAY("星期三"), //3
THURSDAY("星期日"), //4
FRIDAY("星期五"), //5
SATURDAY("星期六");
//成员变量
private String name;
//构造方法
private Week() {
}
private Week(String name) {
this.name = name;
}
@Override
public String toString() {
return "Week{" +
"name='" + name + '\'' +
'}';
}
}
枚举类的常用方法
public String name()
获取枚举项的名称
public int ordinal()
获取枚举项的索引
public int compareTo(E o)
比较枚举项的顺序(就是拿着枚举项的索引进行相减)
int num= Week.MONDAY.compareTo(Week.FRIDAY)
public String toString()
如果复写该方法,打印枚举项的时候得到的就是复写的内容
注解
注解表示一个标识(标注、标记),它可以用在类上、方法上、变量上等,给类的各个组成部分一些额外的表示,能够被编译器识别
@Override: 描述一个方法是复写的父类方法
@Deprecate: 描述一个方法是过时的方法,调用过时的方法会有一个横线
@SuppressWarnings(value = "all"): 压制警告
自定义注解
public @interface 注解名称{
//属性
public 数据类型 属性名() default 默认值;
}
/*
注解的数据类型:
1.基本数据类型
byte short int long float double char boolean
2.字符串 String
3.字节码类型 Class
4.枚举类型
5.前面几种类型的数组
特殊的属性:
如果属性名是value,在给属性赋值的时候value可以省略
*/
元注解
元注解是用来解释注解的注解
//@Test注解存活时间,在运行时期有效 @Retention(value = RetentionPolicy.RUNTIME) //注解可以使用的位置:类、成员变量、方法 @Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD}) @Inherited //注解可以被继承
注解的练习
自定义注解
Retention(RetentionPolicy.RUNTIME) //注解在运行时期有效
@Target(ElementType.TYPE) //注解可以使用在类上
public @interface Anno {
public String classname();
public String methodname();
}
使用注解
//需求:通过配置文件+反射,在不改变源代码的情况下,可以执行任意一个类的任意方法。
@Anno(classname = "com.itheima07.Teacher",methodname = "teach")
public class Demo5 {
public static void main(String[] args) throws Exception {
//获取Demo5类上的注解Anno
Anno anno = Demo5.class.getAnnotation(Anno.class);
//获取Anno注解的属性值
String classname = anno.classname(); //类名
String methodname = anno.methodname(); //方法名
//通过反射获取classname对应的字节码
Class<?> clazz = Class.forName(classname);
//创建类的对象
Object obj = clazz.getConstructor().newInstance();
//通过反射获取methodname对应的方法
Method method = clazz.getMethod(methodname);
//执行方法
method.invoke(obj);
}
}