自用 Java 学习(XMl)

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.类似于<>的特殊字符,需要用特殊符号代替
    &lt; < 小于 
    &gt; > 大于 
    &amp; & 和号 
    &apos; ' 单引号 
    &quot; " 引号 
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 Library

2.使用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);
    }
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值