3.xml的应用
    (1)不同系统之间传输数据
    qq之间数据的传输
    画图分析过程
    (2)用来表示生活中有关系的数据
    (3)经常用在配置文件中
    比如现在连接数据库,肯定要知道用户名和密码,数据名称等
    如果修改数据库的信息,不需要修改源代码,只要修改配置文件就可以了

    4.xml的语法
    (1)xml的文档说明
    创建一个文件,后缀名: .xml

    如果写xml,第一步必须要有一个文档声明(写了文档声明之后,表示写xml文件内容)
    <?xml version=”1.0” encoding=”utf-8”?>

    必须写在第一行第一列

    属性:
    version: xml的版本 1.0 1.1
    encoding: xml编码 gbk utf-8
    standalone: 说明文档是否独立存在(很少使用)

    xml乱码问题
    原因:保存文件的编码格式和xml的文档设置encoding编码不一致
    (2)定义元素(标签)
    (3)定义属性
    (4)注释
    (5)特殊字符
    (6)CDATA区
    (7)PI指令

    5.xml的元素定义
    标签定义:
    有开始必须要有结束 :

    标签没有内容,可以在标签内结束:

    标签可以嵌套,必须要合理嵌套
    合理嵌套:
    不合理嵌套:

    一个xml中,只能有一个根标签,其它都是子标签。




    在xml中把空格和换行都当成内容来解析,下面这两段代码含义是不一样的
    1111

    1111


    标签的命名规则
    (1) 代码区分大小写
    (2) 不能以下划线和数字开头
    (3) 不能以XML, xml, Xml开头
    (4) 不能包含空格
    (5) 可以是中文

    6.xml中属性的定义
    xml是标记型文档,可以有属性。
    例如: 属性为id1,属性值为aa。

    属性定义的要求
    (1)一个标签上可以有多个属性

    (2)属性名称不能相同
    (3)属性名称和属性值之间使用“=”,属性值用引号引起来(单引号,双引号)
    (4)属性名称的命名规则遵循标签的命名规则

    7.xml的注释
    写法:<!—注释内容 —>
    注意:注释不能嵌套!
    注释也不能放在第一行第一列,第一行第一列必须放文档声明!

    8.xml的特殊字符
    & &
    < <
    > >
    ” "
    ’ '
    9.CDATA区
    可以解决多个字符都需要转义的操作 例如:if(af){}
    把这些内容放到CDATA区里面,则不需要转义了
    写法:
    <![CDATA[内容]]>
    作用:把特殊字符,当做文本内容,而不是标签。
    10.PI指令(处理指令) 【了解】
    可以在xml中设置样式
    <?xml-stylesheet type=”text/css” href=”css的路径”?>
    设置样式,只能对英文标签名称起作用,对中文标签不起作用。

    11.xml的约束
    任何根节点可以有任何子节点,并不符合实际。
    例如:

    <猫>2132</猫>
    son>
    xml的约束技术: dtd的约束 schema约束

    12.dtd的快速入门
    (1)创建一个文件,后缀名:.dtd
    (2)看xml中有多少个元素,有几个元素,在dtd文件中就写几个 <!ELEMENT>
    按顺序
    (3)判断元素是简单元素还是复杂元素
    复杂元素:没有子元素
    <!ELEMENT 元素名称 (子元素)>
    简单元素:有子元素的元素
    <!ELEMENT 元素名称 (#PCDATA)>

    (4)在xml文件中引入dtd文件
    <!DOCTYPE 根元素名称 SYSTEM “dtd文件路径”>

    (5)使用浏览器打开xml文件,浏览器只负责校验xml的语法,不负责校验的约束
    如果说想校验xml的约束,需要使用工具。

    13.dtd的三种引入方式
    (1)<!DOCTYPE 根元素名称 SYSTEM “dtd路径”>
    (2)引入内部的dtd文件
    <!DOCTYPE 根元素名称[
    <!ELEMENT 根元素名称 (子元素名称1, 子元素名称2)>
    <!ELEMENT 子元素名称1 (#PCDATA)>
    <!ELEMENT 子元素名称2 (#PCDATA)>
    ]>
    (3) 使用外部的dtd文件(网络上的dtd文件)
    <!DOCTYPE 根元素 PUBLIC “dtd名称” “dtd文档的URL”>
    后面学到的struts2框架,使用配置文件 使用外部的dtd文件
    14.使用dtd定义元素——-
    语法:<!ELEMENT 元素名称 约束>

    简单元素:没有子元素的元素
    <!ELEMENT name (#PCDATA)>
    (#PCDATA) : 约束name是字符串
    EMPTY : 约束元素为空
    ANY : 任意 可为空可不为空

    复杂元素:有子元素的元素
    <!ELEMENT 根元素名称 (子元素1,子元素2)>
    子元素只能出现一次

    表示子元素出现的次数:
    + : 子元素出现1次或者多次
    ? : 子元素出现0次或者1次
    : 子元素出现0次或者1次或者多次

    子元素之间使用逗号“,”隔开,表示元素出现的顺序
    子元素之间使用“|”隔开,表示根元素只能有其中的任意一个子元素

    15.dtd定义属性
    语法:<!ATTLIST 元素名称
    属性名称 属性类型 属性的约束
    <
    属性的类型:
    CDATA : 字符串
    <!ATTLIST name
    ID1 CDATA #REQUIRED
    >
    枚举 : 只能出现其中的一个 (aa|bb|cc)
    <!ATTLIST age
    ID2 (AA|BB|CC) #REQUIRED
    >
    ID: 值只能是字母或下划线开头
    <!ATTLIST birthday
    ID3 ID #REQUIRED
    >
    属性的约束:
    #REQUIRED 属性必须存在
    #IMPLIED 属性可有可无
    #FIXED 表示属性是一个固定值 #FIXED “AAA” 属性可有可无。
    直接值: 不写则为默认值,写了则修改。 属性可有可无。

    16.dtd中实体的定义
    语法:<!ENTITY 实体名称 “实体的值”>
    使用:&实体名称;
    注意:定义的实体需要写在内部的dtd里面,如果写在外部的dtd里面,在某些浏览器下,内容得不到

    17.xml的解析的简介(写到java代码)
    xml是标记型文档。js使用dom解析标记型文档。
    根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装出对象。Document对象,element对象,Node节点对象,属性对象,文本对象。

    xml解析的技术: dom和sax
    dom解析:(根据xml的层级结构在内存中分配一个树形结构,把xml的标签,文本和属性都封装成对象)
    优点:方便实现增删改查
    缺点:容易造成内存溢出
    sax解析:(采用事件驱动,边读别解析) 从上到下,一行一行解析,解析到某个对象,把对象名称返回。
    优点:不会造成内存溢出,实现查询
    缺点:不能实现增删改的操作

    想要解析xml,首先需要解析器
    不同的公司和组织提供了 针对dom和sax方式的解析器
    (1)sun公司提供了针对dom和sax解析器 jaxp
    (2)dom4j组织提供了针对dom和sax解析器 dom4j(实际开发中)
    (3)jdom组织提供了针对dom和sax解析器 jdom

    18.jaxp中的Dom的api的查看

    Dom解析器在jdk的javax.xml.parsers包里面
    四个类:分别是针对dom和sax解析使用的类

    Dom:
    DocumentBuilder : 解析器
    (1)这个类是一个抽象类,不能new对象
    此类的实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
    (2)Parse(“xml路径”)返回Document整个文档
    返回的Document是一个接口,父接口是Node,如果在Document中找不到的方法,可以到Node中去找。
    (3)Documen类的方法:
    getElementsByTagName(String tagname)
    得到标签,返回集合NodeList

    NodeList的遍历:
    getLength(): 得到集合的长度
    item(int index): 返回Node节点
    Node节点的方法:
    getTextContent():获取标签里面的内容

    createElement(String tagName)
    创建标签
    createTextNode(String data)
    创建文本

    Node类的方法:
    appendChild(Node newChild)
    把文本添加到标签下面
    removeChild(Node oldChild)
    通过父节点删除子节点
    replaceChild(NodenewChild,NodeoldChild)
    ``通过父节点替换子节点
    getParentNode()
    ``获取父节点
    ` <br /> DocumentBuilderFactory : 解析器工厂<br /> 这个类是抽象类,不能new对象<br />通过静态方法newInstance()来获取DocumentBuilderFactory的实例<br /> <br /> <br />19.使用jaxp中的Dom实现查询的操作<br />要求:打印所有name标签的内容 文件:person.xml<br /> 代码实现:Jaxp.TestJaxp类的Test01()<br /> <br />20.使用jaxp中的Dom添加节点 <br /> <br />要求:<br />在第一个p1末尾添加<sex>nv</sex> 文件:person.xml<br />代码实现:Jaxp.TestJaxp类的Test02()<br /> <br /> <br /> <br />回写文件:<br /> Transformer : 抽象类,不能new对象<br />想要获取Transformer实例,TransformerFactory.newTransformer()获取。<br />方法:<br />transform(Source xmlSource,Result outputTarget)<br />(1)Source是接口,DomSource是其实现类。DOMSource(Node n)<br />(2)Result是接口,StreamResult是实现类。 [**StreamResult**]()([String]() systemId)`

    TransformerFactory : 抽象类,不能new对象
    想要获取TransformerFactory实例,通过静态方法newInstance()获取

    new DOMSource(document),new StreamResult(“src/person.xml”));
    *

    21.使用jaxp中的Dom修改节点

    要求:修改第一个p1节点的sex子节点的内容 person.xml
    代码实现:Jaxp.TestJaxp类的Test03()

    setTextConetent() : (设置)修改标签的内容

    22.使用jaxp中的Dom删除节点

    要求:删除第一个sex节点 person.xml
    代码实现:Jaxp.TestJaxp类的Test04()

    23.使用jaxp中的Dom遍历节点

    要求:把xml中的所有元素名称都打印出来 person.xml
    代码实现:Jaxp.TestJaxp类的Test05()

    getNodeName() :获取元素名称
    getNodeType() :判断是否是元素类型
    node.getNodeType()==Node.ELEMENT_NODE

    24.schema约束
    schema符合xml语法,xml语句。
    一个xml中只能有一个dtd约束,但是可以有多个schema,多个schema使用名称空间区分(类型java包名)
    schema可以支持更多的数据类型。
    schema语法更加复杂,schema目前不能替代dtd

    25.schema的快速入门
    创建一个schema文件 后缀名: .xsd
    根节点:
    根节点属性:
    xmlns=http://www.w3.org/2001/XMLSchema
    表示当前xml文件是一个约束文件
    targetNamespace=http://www.itcast.cn/20151111
    使用schema约束文件,直接通过这个地址引入约束文件
    elementFormDefault=”qualified”

    步骤:
    (1)看xml有多少个元素
    (2)看简单元素和复杂元素
    如果是复杂元素:


    子元素


    (3)简单元素,写在复杂元素
    —子元素是按顺序排列的
    : 同一个元素只能出现一次
    : 只能出现其中的一个
    <element name=
    “name” type=“string”>
    <element name=
    “age” type=“int”>

    (4)在被约束文件里面引入schema约束文件
    <person xmlns:xsi=[_http://www.w3.org/2001/XMLSchema-instance
    ](http://www.w3.org/2001/XMLSchema-instance)
    — 表示xmls是一个被约束文件

    xmlns=http://www.example.org/1
    — 约束文档里面的targetNamespace

    xsi:schemaLocation=http://www.example.org/1 1.xsd”>
    — targetNamespace(空格) 约束文档的地址路径

    额外知识:
    : 修饰子元素,表示出现的次数没限制

    定义复杂元素的属性:
    写在上面。

    use:修饰属性是否要出现
    required : 必须出现


    26. jaxp中的Sax的api的查看
    jaxp解析:在java.xml.parsers包里有2个类
    (1) SAXParser :解析器
    抽象类,不能new对象。
    实例由SAXParserFactory.newSAXParser()方法获得
    —parse(File f,DefaultHandler dh)
    第一个参数:xml的路径
    第二个参数:事件处理器
    当把事件处理传递进来,相当于在方法里面绑定了一个事件,自动执行事件,自动执行方法
    (2) SAXParserFactory :解析器工厂
    抽象类,不能new对象。
    实例由newInstance()``方法获得

    DefaultHandler类中的三个方法:事件自动执行以下方法
    (1)startElement(Stringuri,StringlocalName,StringqName,Attributesattributes)
    接收元素开始的通知
    qName: 标签名称
    (2)endElement(Stringuri,StringlocalName,StringqName)
    ``接收元素结束的通知
    (3)characters(char[] ch, int start, int length)
    接收元素中字符数据的通知
    返回文本的内容
    new String(ch,start,length)

    27.使用Jaxp中的Sax解析xml
    sax方式不能实现增删改操作,只能做查询操作
    步骤:
    1. 创建解析器工厂
    2. 创建解析器
    3. 执行parse方法
    4. 自己创建一个类,继承DefaultHandler
    5. 重写DefaultHandler中的startElement,endElement,characters方法

    案例1:打印出整个文档
    代码实现:Jaxp.TestSax类.Test01()

    案例2:打印所有同名标签的值
    代码实现:Jaxp.TestSax类.Test02()

    28.使用dom4j解析xml
    得到Document:
    SAXReader reader=new SAXReader();
    Docuoment document=reader.read(url);
    Document是一个接口,父接口是Node.
    Document的方法: getRootElement(): 获取根节点,返回的是Element

    Element也是一个接口,父接口是Node.
    Node的方法:
    getParent(): 获取父节点
    addElement() : 添加标签
    Element的方法:
    element(qname)
    获取标签下面的第一个子标签
    qname:标签名称
    elements(qname)
    获取标签下面是这个名称的所有子标签(一层)
    qname:标签名称
    elements()
    获取标签下面的所有一层子标签
    获取标签下面的所有一层子标签

    29.使用dom4j查询xml
    案例1:查询所有name元素的值 person3.xml
    步骤:
    1. 创建解析器
    2. 得到Document
    3. 得到根节点
    4. 得到所有的p1标签
    5. 得到name
    6. 得到name里面的值
    代码实现:Dom4j.Test01类

    案例2:查询第一个name元素的值 person3.xml
    步骤:
    1. 创建解析器
    2. 得到Document
    3. 得到根节点
    4. 得到第一个p1标签
    5. 得到第一个p1下的name元素
    6. 得到name里面的值
    代码实现:Dom4j.Test01类

    30. 使用dom4j添加元素
    案例1:在第一个p1标签末尾添加一个元素 person3.xml
    代码实现:Dom4j.Test02类
    步骤:
    1. 创建解析器
    2. 得到Document
    3. 得到根节点
    4. 得到第一个p1标签
    5. 在p1下面添加元素
    6. 在添加完成后的元素下添加文本
    7. 回写xml

    31.使用dom4j在特定位置添加元素
    案例1:在第一个p1下面的age标签之前添加嘉应学院
    person3.xml
    代码实现:Dom4j.Test03类
    步骤:
    1. 创建解析器
    2. 得到Document
    3. 得到根节点
    4. 得到第一个p1标签
    5. 获取p1下面的所有元素
    elements()获取所有元素,返回list集合
    创建元素DocumentHelper.createElement(“元素名”)
    使用list里面的方法,在特定位置添加元素
    6. 回写xml

    32.使用dom4j修改节点的操作
    案例1:修改第一个p1下面的age元素的值 person3.xml
    代码实现:Dom4j.Test04类
    步骤:
    1. 创建解析器
    2. 得到Document
    3. 得到根节点
    4. 得到第一个p1标签
    5. 得到第一个age元素
    6. 修改值为30
    7. 回写xml

    33.使用dom4j删除节点的操作
    案例1:删除第一个p1下面的第一个sex元素 person3.xml
    代码实现:Dom4j.Test05类
    步骤:
    1. 创建解析器
    2. 得到Document
    3. 得到根节点
    4. 得到第一个p1标签
    5. 得到第一个sex元素,并通过父节点删除子节点
    6. 回写xml

    34.使用dom4j来获取元素的属性值
    案例1:打印第一个p1的id1属性的值 person3.xml
    代码实现:Dom4j.Test06类

    35.使用dom4j支持xpath的操作
    可以直接获取到某个元素,不需要一层一层的解析
    (1)/AAA/DDD/BBB : AAA下面的DDD下面的BBB
    (2)//BBB : 名称是BBB的所有元素
    (3)/AAA/BBB/ : 在AAA下面的BBB下面的所有元素
    (4)//
    : 所有元素
    (5)BBB[1] : 第一个BBB元素
    BBB[last()] :最后一个BBB元素
    (6)//BBB[@id] : 有id属性的所有BBB元素

    36.使用dom4j支持xpath具体操作
    默认情况下,dom4j是不支持xpath。需要导入jaxen.jar (dom4j.lib)
    在dom4j里面提供了两个方法,支持xpath.
    selectNodes(“xpath表达式”)
    获取多个节点
    selectSingleNode(“xpath表达式”)
    获取一个节点

    案例1:使用xpath查询xml中所有name元素的值 person3.xml
    代码实现:Dom4j.Test07类

    37.实现简单的学生管理系统
    代码实现:Project包的所有代码