Day11.xml&反射

1.xml简介:

  1. 概述:

XML: 全称为Extensible Markup Language ,意思是可扩展的标记语言

Xml标签特点:是一种自定义标签,我们可以进行自定义。

HTML:超文本标记语言Hyper Text Markup Language)

Html标签特点:标签是预定义好的,我们不可以自己随便定义。

  1. 作用:
    1. 配置文件
    2. 存储数据,传输数据(已过时)
  2. 书写规范:
    1. xml文档必须有根元素,有且仅有一对根元素
    2. xml文档必须有关闭标签,标签成对出现,或者是自关闭
    3. xml标签对大小写敏感,区分大小写
    4. xml元素必须被正确嵌套
    5. 属性必须加引号
    6. 名称可以含字母、数字以及其他的字符

      名称不能以数字或者标点符号开始

      名称不能以字符 "xml"(或者 XML、Xml)开始 -----(建议)

      名称不能包含空格

  3. 特殊字符:


  4. xml组成:
    1. 声明:<?xml version="1.0" encoding="UTF-8"?>

      a. version:指定xml文档版本,必须属性,我们不会选择1.1,只会选择1.0

          b.encoding:指定当前文档的编码,默认值是utf-8

    2. 元素: element

<servlet>

1.元素是xml文档中最重要的组成部分,

2.普通元素的结构开始标签 元素体 结束标签组成。例如<hello>大家好</hello>

3.元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>

4.空元素:只有开始标签,没有结束标签,但元素必须自己闭合。例如:</c>

5.元素命名规则:a.区分大小写 b.不能使用空格 c.不建议以XML 、xml、Xml开头

6.格式化良好的XML文档,必须只有一个根元素

  1. 属性:

<web-app version="2.5">

1.属性是元素一部分,它不许出现在元素的开始标签中

2.属性的定义格式:属性名=属性值,其中属性值必须使用单引号或双引号

3.一个元素可以有0-N个属性,但是一个元素中不能出现同名属性

4.属性名不能使用空格、冒号等特殊字符,且必须以字母开头

  1. 注释:

    <!-- -->

  2. CDATA区:

    <![CDATA[]]>:内容原样显示

  1. xml解析:

    概述:当将数据存储在xml后,我们就希望通过程序获得xml内容。。人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作xml

    解析方式:

    DOM

        概述:要求解析器把整个xml文档装在到内存,并解析成一个Document对象

        优点:元素与元素之间保留结构关系,故可以进行增删改查操作

        缺点:xml文档过大,可能出现内存溢出现象

    SAX:

        概述:是一种速度更快,更有效的方法,它逐行扫描文档,一别扫描一别解析,并以事件驱动的方式进行具体解析,每执行一行,豆浆触发对应的事件

        优点:处理速度快,可以处理大文档

        缺点:只能读,逐行后将释放资源

         PULL:

    概述:Android内置的xml解析方式,类似SAX

        常见解析开发包:

            JAXP:sun公司提供支持DOM和SAX开发包

            JDom:dom4j兄弟

            jsoup:一种处理HTML特定解析开发包

            dom4j:比较常用的解析开发包,hibernate底层采用

  1. dom4j:


    使用步骤:

    1. 步骤一:导入jar包
    2. 步骤二:准备相应的xml文件
    3. 步骤三:写java代码进行解析
      1. 查看api(抄)
      2. 常用API如下:


代码实现:

package cn.itcast_01;
import java.util.List;

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import org.junit.Test;

public class Dom4jTest {

    @Test

    public void demo01() throws DocumentException{

        //创建解析器

        SAXReader reader = new SAXReader();

        //对具体的文件进行解析,(参数:文件的路径)

        Document document = reader.read("WebContent/dom4j/persons.xml");


        //得到根元素

        Element root = document.getRootElement();

        //获得子元素

        List<Element> elements = root.elements();

        for (Element element : elements) {

            System.out.println(element);

        }

    }


    @Test

    public void demo02() throws DocumentException{

        //创建解析器

        SAXReader reader = new SAXReader();

        //读取相应的xml文件,

        Document document = reader.read("WebContent/dom4j/persons.xml");


        //获得根元素

        Element root = document.getRootElement();

        //获得根元素下的所有子元素

        List<Element> elements = root.elements();

        //System.out.println(elements);


        //获得第一个子元素

        Element element = elements.get(0);


        //获得标签的名字

        String name = element.getName();

        //System.out.println(name);


        //获得指定的属性对象

        Attribute attribute = element.attribute("id");

        //通过属性对象获得属性值

        String value = attribute.getValue();

        //System.out.println(value);


        //直接获得相应的属性值

        String value2 = element.attributeValue("id");

        System.out.println(value2);


        //获得指定标签元素对象

        Element element2 = element.element("name");


        //获得相应标签文本值

        String text = element2.getText();

        System.out.println(text);


        //直接获得指定标签的文本内容

        String text2 = element.elementText("name");

        System.out.println(text2);


    }


}

  1. Xpath
    1. 概述:是一种基于dom4j可以快速对xml文件进行遍历
    2. 使用步骤
      1. 步骤一:导入jar包(dom4j的包和xpath的包)
      2. 步骤二:document.selectNodes(xpath语法) document。SelectSingleNode(xpath语法)
      3. 步骤三:写一个类:
        1. 抄API

代码:

package cn.itcast.xpath;
import java.util.List;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.Node;

import org.dom4j.io.SAXReader;

import org.junit.Test;

public class XpathDemo {

    @Test

    public void demo01() throws Exception{

        //创建解析器

        SAXReader reader = new SAXReader();


        //读取文档对象

        Document document = reader.read("WebContent/dom4j/persons.xml");


        //xpath操作 //bbb

        List<Element> element = document.selectNodes("//name");

        for (Element element2 : element) {

            String text = element2.getText();

            System.out.println(text);


        }

    }


    @Test

    public void demo02() throws Exception{

        //创建解析器

        SAXReader reader = new SAXReader();

        //读取文档对象

        Document document = reader.read("WebContent/dom4j/persons.xml");

        //xpath操作 //BBB[@id="b1"]

        Node selectSingleNode = document.selectSingleNode("//person[@id='001']/name");

        String text = selectSingleNode.getText();

        System.out.println(text);

    }

}

2. xml约束

:规定

(1)DTD约束:

比较老 语法比较简单 好学。

使用:<!ELEMENT 元素名称 内容> 修饰标签的格式

a)内容约束:有两类:(因为我们的标签有两类,子标签和文本值)

i.     +:相应的子标签有 大于等于1个。

         *:可以有子元素 也可以没有子元素

?:可以有0个或者1个子元素

|:选择

():分组

ii. 文本值

(#PCDATA):简单的理解为可以写出了标签之外的文本内容

ANY:我们可以在开始标签和结束标签之间写任意内容

EMPTY: 没有文本内容。

b)属性的约束:<!ATTLIST 标签 标签的属性 值 类别>

C)导入方式:

(2)Schema约束:

a).概述:是新的xml文档的约束,比DTD强大很多,是其的替代者。Schema本身也是xml文档,但其扩展名为xsd,其功能更强大,数据类型更完善,支持名称空间

b).分类:

    i.简单标签:无元素、无属性

    ii.复杂标签:有子元素,有属性

使用element修饰标签:

maxOccurs:最多有几个子标签。

minOccurs:最少有几个子标签。

使用attribute修饰属性:

<attribute name="bid" type="int" use="prohibited"/>

属性的修饰

name:属性的名字。

type: 属性值的类型

use:属性值的设置

prohibited:必须不能有属性

required:必须有属性值

optional:可以有属性值 也可以没有。

3.反射(reflect)

  1. 概述:java反射机制是在运行状态中,对于任意一个类,都能够知道这个类和所有属性的方法,对于任意一个对象,都能够调用它的任意一个方法和属性

    使用反射,可以在运行时对类Class、构造方法Constructor、普通方法Method、字段Field进行操作

  2. Class对象:

概述:是对class文件(字节码文件)的描述对象

获得Class对象:

已经类的完整路径名(字符串):Class.froName(...)

已经类型:String.class , 确定参数列表

已经对象:obj.getClass()

常用方法:

使用默认构造方法创建实例

c)    Constructor对象:

    概述:是构造方法的描述对象

    获得构造方法:

        公共的构造方法:Constructor<T> getConstructor(Class<?>...parameterTypes),可变参数用于确定形式参数列表

        已经声明的构造方法:Constructor<T>getDeclaredConstructor(Class<?>...parameterTypes), 获得私有的构造

    实例化对象实例:

        newlnstance(Object... initargs),可变参数用于确定实际参数列表

    

d). Method对象:

    概述:是普通方法的描述对象

    获得方法:

        获得公共方法:Method getMethod(String name, Class<?>... parameterTypes) 通过方法name获得方法,可变参数为方法的形式参数列表

        获得声明方法:Method getDeclaredMethod(String name, Class<?>... parameterTypes) 方法操作

        执行指定的方法:Object invoke (Object obj , Object... args) 执行指定对象obj,指定方法,可变参数为方法的实际参数列表


    e). Field对象:

概述:是字段的描述对象

获得方法;

所有字段:Filed getFiled(String name) 通过字段名称

声明字段:Filed getDeclaredFiled(String name)

操作:

获得内容:Object get (Object obj)

设置内容:void set (Object obj,Object value),确定实例对象

小温

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: