XML的语法
1.xml是由自定义的标签组成 <开始标签>标签体结束标签> <自闭合标签/>2.xml文件的语法 1)必须要有一个文档声明 xml version="1.0" encoding="UTF-8" ?> 2)只有一个根标签 3)特殊字符 如< > & 必须使用特殊的比较进行代替 < < 小于 > > 大于 & & 和号 ' '单引号 " "引号 4)CDATA区,数据可以被原样显示,不被当做标签解析 [CADATA[内容]]>
<?xml version="1.0" encoding="UTF-8" ?><students> <student id="001"> <name>张三name> <age>20age> student>students>
DOM解析
使用Java代码来识别xml中的数据,这个过程叫做xml解析。
Document对象: 表示整个xml文件ELEMENT对象: 表示某一个标签Arribute对象:表示属性对象Text对象: 表中体
导入dom4j.jar包
1.在模块下新建一个lib文件夹2.复制dom4j-1.6.1.jar到lib目录下3.选中jar文件右键,点击Add As Library
查看dom4j提供的文档,解析xml文件
SAXReader reader = new SAXReader();//获取整个dom数Document document = reader.read("day17/a.xml");//获取根标签Element rootElement = document.getRootElement();//获取根标签下面的子标签,子标签有多个List<Element> list = rootElement.elements("student");//创建用于存储Student对象的集合,解析后的数据封装为Student对象List<Student> stuList=new ArrayList<>();//遍历集合for (Element element : list) { //获取id属性的值 String id = element.attribute("id").getValue(); //获取name标签的标签体 String name = element.element("name").getText(); //获取age标签的标签体 String age = element.element("age").getText(); //把id,name,age封装为对象 Student stu=new Student(id,name,Integer.parseInt(age)); stuList.add(stu);}//遍历集合for (Student student : stuList) { System.out.println(student);}
DTD约束
定义DTD约束文件
引入DTD约束到xml
<?xml version="1.0"?><note> <to>Georgeto> <from>Johnfrom> <heading>Reminderheading> <body>Don't forget the meeting!body>note>
schema约束
定义约束文件
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.w3school.com.cn"xmlns="http://www.w3school.com.cn"elementFormDefault="qualified"> <element name="persons"> <complexType> <sequence> <element name = "person"> <complexType> <sequence> <element name = "name" type = "string">element> <element name = "age" type = "string">element> sequence> <attribute name="id" type="string" use="required">attribute> complexType> element> sequence> complexType>xs:schema>
引入约束文件
<?xml version="1.0"?>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn person.xsd">张三23
枚举
枚举就是把几个固定的常量列举出来。枚举本质上也是一个类,只不过这个类的对象是几个固定的值,不能让外界创建对象。
public enum Week { //枚举项表示Week类的对象,带括号表示使用有参数构造方法, 不带括号,表示使用空参数构造方法 SUNDAY("星期日"), MONDAY("星期一"), TUESDAY,WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; private String value; //星期几 //把构造方法私有化,目的就是不让别人创建的对象 private Week() { } //把构造方法私有化,目的就是不让别人创建的对象 private Week(String value) { this.value = value; } @Override public String toString() { return "Week{" + "value='" + value + '\'' + '}'; }}
枚举类的方法。
public String name() 获取枚举项的名称public int ordinal() 获取枚举项的索引public int compareTo(E o) 比较枚举项的顺序public String toString() 返回枚举项的名称,如果不想要枚举项的名称也可以复写这个方法。public static T valueOf(Class<T> enumType, String name) 获取枚举项
注解
注解用来给代码添加一些额外的标注,可以写在类上,写在方法上,写在变量上。
Java的内置注解
@Override: 复写父类方法@Deprecated: 标记这个方法过时了@SuppressWarnings: 压制警告
自定义注解
//表示注解的存活时间,在运行时有效@Retention(value = RetentionPolicy.RUNTIME)@Target(value = ElementType.TYPE)public @interface Anno { //定义注解的属性,default设置默认值 public String name(); public String methodname();}
使用反射来解析注解
@Anno(name = "com.itheima.Teacher",methodname = "teach")public class Demo { public static void main(String[] args) throws Exception { //获取Demo类的字节码 Class<Demo> clazz = Demo.class; //获取类上的注解 Anno anno = clazz.getAnnotation(Anno.class); //获取注解的属性 String classname = anno.name(); String methodname = anno.methodname(); //获取要执行的类的字节码 Class> stuClazz = Class.forName(classname); //通过字节码创建的对象 Object obj = stuClazz.getConstructor().newInstance(); //获取方法 Method method = stuClazz.getMethod(methodname); //执行方法 method.invoke(obj); }}