xml配置文件,枚举,注解

    一,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文件中可以存在一下特殊字符

        &lt;        <         小于

        &gt;        >        大于

        &amp;        &        和号

        &apos;        ’        单引号

        &quot;        ”        引号

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 {

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值