advanced-day17-XML,DTD约束,schema约束及枚举,注解

Posted 是汐江呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了advanced-day17-XML,DTD约束,schema约束及枚举,注解相关的知识,希望对你有一定的参考价值。

XML的语法

 1.xml是由自定义的标签组成
     <开始标签>标签体</结束标签>
     <自闭合标签/>
 2.xml文件的语法
     1)必须要有一个文档声明
    <?xml version="1.0" encoding="UTF-8" ?>
     2)只有一个根标签
     3)特殊字符 < > & 必须使用特殊的比较进行代替
    &lt; < 小于
         &gt; > 大于
         &amp; & 和号
         &apos; '单引号
         &quot; "引号
     
      4)CDATA区,数据可以被原样显示,不被当做标签解析
         <![CADATA[内容]]>
 <?xml version="1.0" encoding="UTF-8" ?>
 <students>
     <student id="001">
         <name>张三</name>
         <age>20</age>
     </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约束文件

 <!ELEMENT note (to,from,heading,body)>
 <!ELEMENT to (#PCDATA)>
 <!ELEMENT from (#PCDATA)>
 <!ELEMENT heading (#PCDATA)>
 <!ELEMENT body (#PCDATA)>
  • 引入DTD约束到xml

 <?xml version="1.0"?>
 <!DOCTYPE note SYSTEM "note.dtd">
 <note>
     <to>George</to>
     <from>John</from>
     <heading>Reminder</heading>
     <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">
  <!--定义persons复杂元素-->
     <element name="persons">
         <complexType>
             <sequence>
                 <!--定义person复杂元素-->
                 <element name = "person">
                     <complexType>
                         <sequence>
                             <!--定义name和age简单元素-->
                             <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"?>
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn person.xsd">
<person id="001">
<name>张三</name>
<age>23</age>
</person>
</note>

枚举

枚举就是把几个固定的常量列举出来。枚举本质上也是一个类,只不过这个类的对象是几个固定的值,不能让外界创建对象。

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

以上是关于advanced-day17-XML,DTD约束,schema约束及枚举,注解的主要内容,如果未能解决你的问题,请参考以下文章

DTD约束

XML 约束

xml约束之dtd

XML的DTD约束

XML——XML文件约束之DTD详解

DTD约束