19-XML&枚举&注解

XML

1.XML-概述

  • XML的全称为(Extensible Markup Language),是一种可扩展的标记语言
    • 标记语言:通过标签来描述数据的一门语言
    • 可扩展:标签的名字是可以自定义的
  • 作用
    • 用于进行存储数据和传输数据
    • 用于软件的配置文件

2.XML-标签

  • 标签由一对尖括号和合法标识符组成
  • 标签必须成对出现
  • 特殊的标签可以不成对,但是必须有结束标签
  • 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
  • 标签需要正确的嵌套

3.XML-语法规则

  • XML文件的后缀名为:xml

  • 必须存在一个根标签,有且只有一个

  • 文档声明必须在第一行第一列

    <?xml version="1.0" encoding= "UTF-8" standalone="yes" ?>
    
    • version:版本号,必须的属性
    • encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
    • standalone:描述XML文件是否依赖其他的xml文件,取值为yes/no
  • XML文件中可以定义注释信息

  • XML文件中可以存在以下特色字符

  • XML文件中可以存在CDATA区:<![CDATA[ 数据 ]]>

4.XML-解析的准备工作

  • 常见的解析工具

    • JAXP:sun公司提供的解析器,支持dom和sax两种思想
    • DOM4J:一款非常优秀的解析器
    • PULL:Android操作系统内置的解析器
    • Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
  • 代码实现

    • xml文件
    <?xml version="1.0" encoding="UTF-8" ?>
    <Students>
        <student id="1">
            <name>李四</name>
            <age>21</age>
        </student>
        <student id="2">
            <name>张三</name>
            <age>22</age>
        </student>
    </Students>
    
    • 测试类
    public class XmlParse {
        public static void main(String[] args) throws DocumentException {
            //1.创建解析器对象
            SAXReader saxReader = new SAXReader();
            //2.利用解析器把配置文件加载到内存中
            Document document = saxReader.read(new File("itheima_XML\\xml\\student.xml"));
            //3.获取跟目录
            Element rootElement = document.getRootElement();
            //4.获取根目录下的子目录
            //elements()这个不带参数的方法是把左右子目录返回一个集合
    //        List elements = rootElement.elements();
            //elements("student") 指定所有的子目录
            List<Element> studentElements = rootElement.elements();
            ArrayList<Student> list = new ArrayList<>();
            for (Element element : studentElements) {
                //获取id这个属性
                Attribute attribute = element.attribute("id");
                String id = attribute.getValue();
                //获取name标签
                Element nameStudent = element.element("name");
                String name = nameStudent.getText();
                //获取age标签
                Element ageStudent = element.element("age");
                String age = ageStudent.getText();
                Student student = new Student(id, name, Integer.parseInt(age));
                list.add(student);
            }
            for (Student student : list) {
                System.out.println(student);
            }
        }
    }
    
    

5.DTD约束

  • 阅读约束文档

    • DTD语法规则

    在这里插入图片描述

    在这里插入图片描述

  • 根据约束写xml文件

6.schema约束

  • 写schema约束的步骤

在这里插入图片描述

  • 引入schema约束的步骤

在这里插入图片描述

  • schema定义属性

在这里插入图片描述

枚举

1.概念

  • 枚举:是指将变量的值一个个的列出来,变量的值只限于列举出来的值的范围

  • 格式

    public enum s{
    	枚举项1,枚举项2,枚举项3;
    }
    
  • 注意:定义枚举类要用关键字enum

2.特点

  • 所有枚举类都是Enum的子类
  • 我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
  • 每一个枚举项其实就是该枚举的一个对象
  • 枚举也是一个类,可以去定义成员变量
  • 枚举类的第一行上必须是枚举项
  • 枚举类可以有构造器,但是必须private的。它默认的也是private的,枚举项的用户比较特殊:枚举("")
  • 枚举类也可以有抽象方法,但是枚举项必须重写该方法
public enum Season {
    SPRING("spring"){
        @Override
        public void getSeason() {
        }
    },
    SUMMER("summer"){
        @Override
        public void getSeason() {
        }
    },
    AUTUMN("autumn"){
        @Override
        public void getSeason() {
        }
    },
    WINTER("winter"){
        @Override
        public void getSeason() {
        }
    };
    private String name;
    /*private Season(){

    }*/
    private Season(String name){
        this.name=name;
    }
    public abstract void getSeason();
}
  • 注意
    • 当注释掉无参构造的时候的,需要每个枚举项用有参构造
    • 有抽象方法的时候,每一个枚举项需要重写抽象方法

3.方法

  • 常见方法

    方法名说明
    String name()获取枚举项的名称
    int ordinal()返回枚举项在枚举类中的索引值
    int compareTo(E o)比价俩个枚举项,返回的是索引值的差值
    String toString()返回枚举常量的名称
    static T valueOf(Class type,String name)获取指定枚举类中的指定名称的枚举值
    values()获取所有的枚举值
  • 代码实现

    public class SeasonDemo {
        public static void main(String[] args) {
            //String name() 获取枚举项的名称
            String name = Season.SPRING.name();
            System.out.println(name);
            System.out.println("==========");
            //int ordinal()  返回枚举项在枚举类中的索引值
            int spring = Season.SPRING.ordinal();
            int summer = Season.SUMMER.ordinal();
            System.out.println(spring);
            System.out.println(summer);
            System.out.println("==========");
            //int compareTo(E o)  比价俩个枚举项,返回的是索引值的差值
            int i = Season.SPRING.compareTo(Season.WINTER);
            System.out.println(i);
            System.out.println("==========");
            //String toString()   返回枚举常量的名称
            String s = Season.SPRING.toString();
            System.out.println(s);
            System.out.println("==========");
            //static<T> T valueOf(Class<T> type,String name)  获取指定枚举类中的指定名称的枚举值
            Season spring1 = Enum.valueOf(Season.class, "SPRING");
            System.out.println(spring1);
            System.out.println(Season.SPRING==spring1);
            System.out.println("==========");
            //values()   获取所有的枚举值
            Season[] values = Season.values();
            for (Season value : values) {
                System.out.println(value);
            }
        }
    }
    

注解

注解用来给代码添加一些额外的标注,可以写在类上,写在方法上,写在变量上。

1.Java的内置注解

@Override: 复写父类方法
@Deprecated: 标记这个方法过时了
@SuppressWarnings: 压制警告

2.自定义注解

//表示注解的存活时间,在运行时有效
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
public @interface Anno {
    //定义注解的属性,default设置默认值
    public String name();
    public String methodname();
}

3.使用反射来解析注解

@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);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z7tjqWkp-1608381966369)(E:\Documents\笔记\Java笔记\Java笔记\JavaSE\assets\Snipaste_2020-12-08_10-48-25.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值