一,XML
1,xml概述
xml是一种可扩展的标记语言
标记语言:通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)
可扩展性:标签的名字是可以自定义的
可以理解为:XML文件是由很多标签组成的,而标签名是可以自定义的
作用:用于进行存储数据和传输数据,作为软件的配置文件
2,XML标签
标签由一对尖括号和合法标识组成
标签必须成对出现
特殊的标签可以不成对,但是必须有结束标记
标签中可以定义属性,属性和标签名空格隔开属性值必须用引号引起来
标签需要正确嵌套
3,XML语法规则
XML文件的后缀名为:xml
文档声明必须是第一行第一列
<?xml version="1.0" encoding= "utf-8" standalone= "yes" ?>
version:该属性是必须存在的
encoding:该属性不是必须的,打开当前xml文件的时候应该是使用什么字符编码表
Standalone:该属性不是必须的,描述xml文件是否依赖其他的xml文件,取值为yes或no
必须存在一个根标签,有且只能有一个
XML文件中可以定义注释信息
XML文件中可以存在一下特殊字符
< < 小于
> > 大于
& & 和号
&apos; ’ 单引号
"; ” 引号
xml文件中可以存在CDATA区
<![CDATA[...内容...]]>
4,DOM解析
Document对象:整个xml文档
Element对象:所有标签
Attribute对象:所有属性
Text对象:所有文本内容
//利用dom4j解析xml文件
public class xmlDemo01 {
public static void main(String[] args) throws DocumentException {
//1,获取一个解析器对象
SAXReader sax = new SAXReader();
//2,利用解析器把xml文件加载到内存中,返回一个文档对象
Document document = sax.read(new File("mXML\\XML\\myxml.xml"));
//3,获取跟标签
Element rootElement = document.getRootElement();
//4,通过跟标签获取Student标签
//elements():可以获取调用者所有的子标签,会把这些子标签放到一个集合中返回
//elements("标签名");可以获取调用者指定的标签,会把这些子标签放到一个集合中。
/* List elements = rootElement.elements();
System.out.println(elements.size());*/
List<Element> student = rootElement.elements("student");
ArrayList<Student> arrayList = new ArrayList<>();
//5,遍历集合,得到每一个student标签
for (Element element : student) {
// System.out.println(element);
//element依次表示每一个student标签
//获取id这个属性
Attribute id = element.attribute("id");
//获取id的属性值
String value = id.getValue();
System.out.println(value);
//获取name标签
//element("标签名“):获取调用者指定的子标签
Element nameelement = element.element("name");
//获取这个标签的标签体
String text = nameelement.getText();
System.out.println(text);
//获取age标签
Element age = element.element("age");
String text1 = age.getText();
System.out.println(text1);
//创建对象
Student stu = new Student(value,text,Integer.parseInt(text1));
arrayList.add(stu);
}
//遍历集合
for (Student student1 : arrayList) {
System.out.println(student1);
}
}
}
5,DTD约束
约束就是用来限定xml文件中可以使用的标签以及属性
告诉程序员,xml该怎么写
DTD语法规则
定义一个元素的格式为:<!ELEMENT 元素名 元素类型>
元素类型有简单元素,复杂元素
简单元素:
EMPTY: 标识标签体为空
ANY: 标识标签体可以为空也可以不为空
PCDATA: 标识该元素的内容部分为字符串
复杂元素:
直接写子元素名称
多个子元素可以使用“,”或者“|”隔开
“,”表示定义元素的顺序
“|”表示子元素只能出现任意一个
“?”表示这个元素出现零次或者一次
“+”一次或者多次
“*”零次或者多次
如果不写则表示出现一次
<!ELEMENT persons (person+) >
<!ELEMENT persons (name,age) >
<!ELEMENT name(#PCDATA) >
<!ELEMENT age (#PCDATA) >
定义一个属性的格式为:<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>
属性的类型:
CDATA类型:普通的字符串
属性的约束
#REQUIRED: 必须的
#IMPLIED: 属性不是必须的
#FIXED value:属性是固定的
<!ATTLIST person id CDATA #FIXD "P1">
schema和dtd的区别
1,schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
2,一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
3,dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
4,schema语法更加复杂
二,枚举
为了间接的表示一些固定的值,java就给我们提供了枚举。
枚举:是指将变量的值一 一列出来,变量的值只限于列举出来的值的范围内。
格式:
public enum s {
枚举项1,枚举项2,枚举项3,枚举项4;
}
定义枚举要使用关键字enum;
1,特点
1,所有枚举类都是Enum的子类
2,我们可以通过“枚举类名.枚举项名称“去范文指定的枚举项
3,每一个枚举项其实就是该枚举项的一个对象
4,枚举也是一个类,也可以去定义成员变量
5,枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他东西,这个分号就不能省略,建议不要省略
6,枚举类可以有构造器,但必须是private的,它默认的也是private的
枚举项的用法比较特殊:枚举(“”);
7,枚举类也可以由抽象方法,但是枚举项必须重写该方法
2,枚举的方法
三:注解
1,什么是注解
注解的主要作用:对我们的程序进行标注和解释
注解名 | 说明 |
@Override | 描述子类重写父类的方法 |
@Deprecated | 描述方法过时 |
@SuppressWarnings | 压制警告 |
@SuppressWarnings(value = "all")
//表示压制本方法中所有的警告
public Student(String name, int age) {
this.name = name;
this.age = age;
}
如果想要一个类中所有的警告都消失,这个注解写在类的上面即可
2,注解和注释的区别
注释:给程序员看的
注解:给编译器看的(让虚拟机看到程序中的注解,注解代表程序的一些特殊功能)
3,自定义注解---格式
public @interface 注解名称{
public 属性类型 属性名 () default 默认值;
}
//定义注解的格式
public @interface Test {
public String name() default "zhangsan";
}
属性的类型可以是:
1,基本数据类型
2,String
3,Class
4,注解
5,枚举
6,以上数据类型的一维数组
public @interface Anno01 {
//1,定义一个基本数据类型的属性
int a() default 1;
//2,定义一个String类型的属性,属性值不写也可以
String name();
//3,定义一个class类型的属性
Class clazz() default Test.class;
//4,定义一个注解类型的属性
Test t() default @Test;
//5,定义一个枚举类型的属性
public Season season() default Season.SPRING;
//int类型的一维数组
int[] arr() default {1, 2, 3, 4, 5};
//枚举类型数组
public Season[] seasonarr() default {Season.SPRING, Season.SUMMER};
}
测试:
//在使用注解的时候,如果注解里面的属性没有指定值,
//那么我们就要手动给出注解的属性值
@Anno01(name = "zhangsan")
public class AnnoDemo01 {
public static void main(String[] args) {
}
}
如果属性的名字是value,那么在测试类中只需要给出值即可
@Anno01("zhangsan")//属性的名字是value public class AnnoDemo01 { }
注解练习,有注解的方法执行
测试类
public class AnnoDemo01 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
//1,通过反射获取useTest的字节码对象
Class<?> aClass = Class.forName("com.cheng.Exercise03.useTest");
//创建对象
useTest o = (useTest) aClass.newInstance();
//2,通过反射获取这个类里面所有的方法对象
Method[] methods = aClass.getDeclaredMethods();
//3,遍历数组得到每一个方法对象
for (Method method : methods) {
//method,就是依次表示方法对象
//isAnnotationPresent(Class<? extends Annotation> annotationClass)
//判断当前方法上是否有指定的注解
//参数:注解的字节码文件对象
//返回值:布尔结果,true 存在 false 不存在
if (method.isAnnotationPresent(Test.class)){
method.invoke(o);
}
}
}
}
注解类
//表示注解存活的时间
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
}
方法类
public class useTest {
public void show(){
System.out.println("show方法");
}
@Test
public void methond01(){
System.out.println("method01方法");
}
@Test
public void method02(){
System.out.println("method02方法");
}
}
4,元注解
就是描述注解的注解
常用的三个元注解
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})//指定注解的使用位置(成员变量,类,方法)
@Retention(RetentionPolicy.RUNTIME)//指定该注解的存活时间
@Inherited//指定该注解可以被继承
public @interface Anno {
}