当Java遇到XML 的邂逅 dom4j

XML简介:

XML:可扩展标记语言!

  01.很象html

  02.着重点是数据的保存

  03.无需预编译

  04.符合W3C标准

 

可扩展:我们可以自定义,完全按照自己的规则来!

威尼斯人棋牌, 

标记: 计算机所能认识的信息符号!

       int  num=5;  教材编号

 

XML语言

XML的组成部分:

01.文档声明  <?xml version="1.0" encoding="UTF-8"?>

02.元素    <p></p>

03.属性    <p  id="haha"></p>

04.注释   <!-- -->

05.特殊字符

06.CDATA区域  Character data   字符數據

07.处理指令   引入css样式

 

<phone>
  <brand name="小米">
    <edition name="1.0">
      <hehe>hehe</hehe>
      <hehe>为发骚而生</hehe>
    </edition>
    <edition name="2.0"/>
  </brand>
  <brand name="华为">
    <edition name="1.0"/>
    <edition name="2.0"/>
  </brand>
  <brand name="苹果">
    <edition name="1.0"/>
    <edition name="2.0"/>
  </brand>
</phone>

 

 

 

什么是XML?

  XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML。它被设计的宗旨是传输数据,而非显示数据。 XML标签没有被预定义,需要用户自行定义标签。 XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。 XML被广泛认为是继Java之后在Internet上最激动人心的新技术。

注意点:

01.xml文件中只能有一个根节点

02.节点要成对出现  有开发和闭合

03.节点必须正确的嵌套

04.严格区分大小写

05.空格和换行都是特殊字符 会被解析器解析

 

xml,html都是一个类似于倒挂的树!

只有一个根节点,枝叶茂盛!

我们把这个倒挂的树称之为===》dom树!

DOM:(Doucument Object Model)文档对象模型!

 

XML技术用于解决什么问题?

  在现实生活中存在大量有关系的数据,如右图所示。 

威尼斯人棋牌 1

问题:这样的数据该如何表示并交给计算机处理呢?

 

XML语言出现的根本目的在于描述向上图那种有关系的数据。

XML是一种通用的数据交换格式。

在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在起始标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。

XML中的数据必须通过软件程序来解析执行或显示,如IE;这样的解析程序称之为Parser(解析器)。

 

<?xml version="1.0" encoding="UTF-8"?>
<中国>
    <北京>
        <海淀></海淀>
        <丰台></丰台>
    </北京>
    <山东>
        <济南></济南>
        <青岛></青岛>
    </山东>
    <湖北>
        <武汉></武汉>
        <荆州></荆州>
    </湖北>
</中国>

 

特殊字符:

>   &gt;
<   &lt;
&   &amp;
'   &apos;
"   &quot;

 

 

 

XML常见应用:

XML技术除用于保存有关系的数据之外,它还经常用作软件配置文件,以描述程序模块之间的关系。(如后面将要学习到的Struts、Spring和Hibernate都是基于XML作为配置文件的)

在一个软件系统中,通过XML配置文件可以提高系统的灵活性。即程序的行为是通过XML文件来配置的,而不是硬编码。

数据交换:不同语言之间用来交换数据

小型数据库:用来当数据库存储数据。

CDATA区域:

XML解析器不会处理,而是当成字符串原样输出!

 语法:

<![CDATA[xml内容]]>

 

 

XML语法:

创建第一个maven项目:

1.new  project===>maven==>quick==>archetypeCatalog=internal

2.引入需要的pom节点

3.自定义一个xml文件  (学校  年级  班级)

4.需求通过dom4j实现查询学校下面的年级以及班级信息

5.创建一个测试类 书写代码

具体操作请看:

https://www.cnblogs.com/lsy131479/p/9237154.html

 

XML语法:

一个XML文件分为如下几部分内容:

  文档声明 元素 属性 注释 CDATA区 、特殊字符 处理指令(PI:Processing Instruction)

解析xml文件的方式:

01.DOM:基于xml文档树结构的解析,把xml文件中的内容都读取到内存中,

         比较占内存,消耗资源多!

02.SAX:基于事件的解析。消耗资源小!

03.JDOM:针对于java的特定模型!满足2 8原则!自身没有解析器,依赖于SAX2!

04.DOM4J:for(4)JDOM的一个分支!源码开放,性能优异,功能强大!

 

文档声明

在编写XML文档时,需要先使用文档声明来声明XML文档。且必须出现在文档的第一行。并且必须指定

最简单的语法:

<?xml version=“1.0”?>

 

encoding属性说明文档所使用的字符编码。保存在磁盘上的文件编码要与声明的编码一致。如:

<?xml version=“1.0” encoding=“GB2312”?>

 

standalone属性说明文档是否独立,即是否依赖其他文档。 如:

<?xml version=“1.0” standalone=“yes”?> 

yes不用引入外部的文件,no需要引入。(不常用)

DOM4J解析xml

1. 导入dom4j   jar包

威尼斯人棋牌 2

 

解析代码:

package com.metro.util;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Scanner;

/**
 * @author 房上的猫
 * @create 2018-06-28 11:42
 * @博客地址: https://www.cnblogs.com/lsy131479/
 * <p>
 * 测试
 **/

public class Test {
    static Scanner input = new Scanner(System.in);
    static Document doc = null;
    static Element root = null;
    //常量路径
    static final String URL = "src/main/resources/phone.xml";
    //主程序
    public static void main(String[] args) {

        System.out.println("***1.查询所有");
        System.out.println("***2.修改");
        System.out.println("***3.删除");
        System.out.println("***4.添加");
        System.out.print("*************请选择:");
        int choose = input.nextInt();
        getDocument();
        System.out.println("==============start==============");
        switch (choose) {
            case 1:
                Iterator<Element> brands = root.elementIterator();
                findAll(brands, 0);
                break;
            case 2:
                up();
                break;
            case 3:
                del();
                break;
            case 4:
                add();
                break;
        }
        System.out.println("==============exit==============");
    }
    //添加
    private static void add() {
        Element brand = root.addElement("brand");
        brand.addAttribute("name", "hehe");
        Element edition = brand.addElement("edition");
        edition.addAttribute("name", "xx");
        edition.addText("ssss");
        saveXML();
    }
    //删除
    private static void del() {
        Iterator<Element> brand = root.elementIterator();
        while (brand.hasNext()) {
            Element next = brand.next();
            // System.out.println(next.attributeValue("name"));
            if (next.attributeValue("name").equals("haha")) {
                root.remove(next);
            }
        }
        saveXML();
    }
    //修改
    private static void up() {
        Iterator<Element> brand = root.elementIterator();
        while (brand.hasNext()) {
            Element next = brand.next();
            // System.out.println(next.attributeValue("name"));
            if (next.attributeValue("name").equals("hehe")) {
                next.setAttributeValue("name", "haha");
            }
        }
        saveXML();
    }
    //保存xml
    private static void saveXML() {
        XMLWriter writer = null;
        OutputFormat format = null;

        try {
            format = OutputFormat.createPrettyPrint();
            writer = new XMLWriter(new FileWriter(URL), format);
            writer.write(doc);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //查询所有
    private static void findAll(Iterator<Element> brands, int count) {
        String t = "";
        //设置缩进
        for (int i = 0; i < count; i  ) {
            t  = "t";
        }
        while (brands.hasNext()) {
            Element brand = brands.next();
            System.out.println(t   "name:"   (brand.attributeValue("name") == null ? "" : brand.attributeValue("name")));
            System.out.println(t   "text:"   brand.getTextTrim());
            //预先构建子节点迭代器
            Iterator<Element> iterator = brand.elementIterator();
            //递归
            findAll(iterator,   count);
        }

    }

    //初始化
    public static void getDocument() {
        SAXReader reader = new SAXReader();
        try {
            doc = reader.read(URL);
            root = doc.getRootElement();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

 

元素

 

 

标签

XML元素指XML文件中出现的标签。

一个标签分为起始和结束标签(不能省略)。一个标签有如下几种书写形式:

  包含标签主体:<mytag>some content</mytag>

  不含标签主体:<mytag/>

一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套。

<mytag1><mytag2></mytag1></mytag2> WRONG!

一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签。

DTD:

Document Type Definition(文檔類型定義)

01.规范我们的编码

02.在浏览器中正常的显示

 

 

<!ELEMENT school (grade ),(class|student)>

ELEMENT :元素,关键字

school:元素名称

grade:子元素或者元素类型  CDATA  PCDATA (Parse)解析数据,不能包含子元素

 

():用来给元素分组
| :两者必须选择一个
  : 1-N,至少出现一次
* : 0-N,可有可无,并且可以多次
?: 0|1,最多一次
,:元素出现的顺序

 

 

标签的空格、换行

对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。

威尼斯人棋牌 3

由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。

DTD文档使用方式:

命名规范

一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:

  区分大小写,例如,<P>和<p>是两个不同的标记。

  不能以数字或“-” (中划线)开头。

  不能以xml(或XML、或Xml 等)开头。

  不能包含空格。

  名称中间不能包含冒号(:)。

01.内部DTD

<!DOCTYPE 根元素[定义的内容]>

 

 

属性

一个元素可以有多个属性,每个属性都有它自己的名称和取值,例如:<mytag name=“value” …/>

属性值一定要用引号(单引号或双引号)引起来。

属性名称的命名规范与元素的命名规范相同

元素中的属性是不允许重复的

在XML技术中,标签属性所代表的信息也可以被改成用子元素的形式来描述,例如:

<mytag>
    <name>
        <firstName/>
        <lastName/>
    </name>
</mytag>

02.外部DTD

<!DOCTYPE 根元素 SYSTEM "dtd文件位置">

 

 

注释

XML中的注释语法为:<!--这是注释-->

注意:

  XML声明之前不能有注释

  注释不能嵌套,例如:

  威尼斯人棋牌 4

02.内外部DTD

<!DOCTYPE 根元素 SYSTEM "dtd文件位置"[定义的内容]>

 

 

 

 

转义字符

   威尼斯人棋牌 5

  实体必须以符号"&"开头,以符号";"结尾。
  注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。 

  即:< 和 & 的符号要用转义字符, > “ ‘ 可以不使用转义字符。

DTD例子:

xml文件抬头:

<!DOCTYPE phone SYSTEM "phone.dtd">

 

phone.dtd   约束文件:

 

<!ELEMENT phone (brand*)>
<!ELEMENT brand (edition*) >
<!ATTLIST brand name CDATA "XX">
<!ELEMENT edition (hehe*) >
<!ATTLIST edition name CDATA "XX">
<!ELEMENT hehe (#PCDATA) >
<!ATTLIST hehe name CDATA "XX">
<!--
#PCDATA:被解析的字符数据
CDATA:默认值
*:出现0或多次
 :出现最少一次
-->

 

 

 my.html  测试文件:

仅兼容低版本IE

<html>
    <head>
    <!--自己编写一个简单的解析工具,去解析XML DTD是否配套-->     
    <script language="javascript">
        // 创建xml文档解析器对象
        var xmldoc =new ActiveXObject("Microsoft.XMLDOM");


        // 开启xml校验
        xmldoc.validateOnParse = "true";
        // 装载xml文档,即指定校验哪个XML文件
        xmldoc.load("phone.xml");
        document.writeln("错误信息:" xmldoc.parseError.reason "<br>");
        document.writeln("错误行号:" xmldoc.parseError.line);
    </script>

    </head>
    <body>

    </body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

总结:

1.xml  html

2.特点,注意事项

3.maven项目创建的注意点

4.手写xml

5.解析xml的几种方式

6.dom4j解析的步骤

 

CDATA区

CDATA是Character Data的缩写

作用:把标签当做普通文本内容;

语法:<![CDATA[内容]]>

<![CDATA[

  <itcast>www.itcast.cn</itcast>

]]>

以上红色部分被当做普通文本而不是标签

处理指令

处理指令,简称PI(Processing Instruction)。

作用:用来指挥软件如何解析XML文档。

语法:必须以“<?”作为开头,以“?>”作为结尾。 常用处理指令:

常用处理指令:  

  XML声明:

    <?xml version=“1.0” encoding=“GB2312”?>

  xml-stylesheet指令: 作用:指示XML文档所使用的CSS样式XSL。

    <?xml-stylesheet type=“text/css” href=“some.css”?>

    注:对中文命名的标签元素不起作用

XML语法规则总结

  所有 XML 元素都须有关闭标签

  XML 标签对大小写敏感 XML

  必须正确地嵌套顺序

  XML 文档必须有根元素(只有一个)

  XML 的属性值须加引号

  特殊字符必须转义 --- CDATA

  XML 中的空格、回车换行会解析时被保留

 

XML约束:

为什么需要约束

 1.XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat)

 2.XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。

  两个概念:

    格式良好的XML:遵循XML语法的XML

    有效的XML:遵循约束文档的XML

 3.总之:约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。

XML约束概述

1.什么是XML约束

  在XML技术里,可以编写一个文档来约束一个XML

  文档的书写规范,这称之为XML约束。

2.为什么需要XML约束

3.常用的约束技术

  XML DTD

  XML Schema

 

XML约束之DTD约束

DTD概述

  1.DTD(Document Type Definition),全称为文档类型定义。

  威尼斯人棋牌 6

  2.书写完成DTD,并且约束成功后,可以总结书写的过程,更方便记忆。

  复杂标签:<!ELEMENT 标签名 (子节点)>

  简单标签:<!ELEMENT 标签名 (#PCDATA)>

  引入DTD:<!DOCTYPE 根节点 SYSTEM “dtd的地址”>

将DTD与XML文档关联三种方式

  DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写

  1.使用内部DTD

    <!DOCTYPE 根节点 [ DTD的代码 ]>

  2.使用外部DTD

    <!DOCTYPE 根节点 SYSTEM “DTD的地址” >

  3.使用网络DTD

    <!DOCTYPE 根节点 PUBLIC “DTD的名称” “DTD的地址” >

    常见的使用网络DTD约束有 Struts2的框架

在xml文件内编写DTD

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
    <!ELEMENT 书架 (书 )>
    <!ELEMENT 书 (书名,作者,售价)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售价 (#PCDATA)>
]>
<书架>
    <书>
        <书名>Java就业培训教程</书名>
        <作者>张孝祥</作者>
        <售价>39.00元</售价>
    </书>
    ...
</书架>

引入外部DTD文档

  XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种形式:

    当引用的DTD文档在本地时,采用如下方式:  

    <!DOCTYPE 根元素 SYSTEM “DTD文档路径”>

    如:

<!DOCTYPE 书架 SYSTEM “book.dtd”>

    当引用的DTD文档在公共网络上时,采用如下方式:   

    <!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>

    如:

<!DOCTYPE web-app PUBLIC 
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">

DTD约束语法细节

   元素定义 属性定义 实体定义

元素(ELEMENT)定义

  在DTD文档中使用ELEMENT关键字来声明一个XML元素。

  语法:<!ELEMENT 元素名称 使用规则> 

    使用规则:

      (#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data)

      EMPTY:用于指示元素的主体为空。比如<br/>

      ANY:用于指示元素的主体内容为任意类型。

      (子元素):指示元素中包含的子元素

威尼斯人棋牌 7

    定义子元素及描述它们的关系:

      如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。

       如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL)

      如果子元素用“|”分开,说明任选其一。

       如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)

      用 、*、?来表示元素出现的次数

        如果元素后面没有 *?:表示必须且只能出现一次

         :表示至少出现一次,一次或多次

        *:表示可有可无,零次、一次或多次

        ?:表示可以有也可以无,有的话只能有一次。零次或一次 如: <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>

 威尼斯人棋牌 8

 属性(ATTLIST)定义

威尼斯人棋牌 9

  属性声明举例
<!ATTLIST 商品
    类别 CDATA #REQUIRED 必须的
    颜色 CDATA #IMPLIED  可选的
>

  对应的XML为:<商品 类别=“服装” 颜色=“黄色”/>

   属性值类型

  CDATA:表示属性的取值为普通的文本字符串

  ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)

  ID:表示属性的取值不能重复(不能只写数字)

  设置说明

  #REQUIRED:表示该属性必须出现

  #IMPLIED:表示该属性可有可无

  #FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"

  直接值:表示属性的取值为该默认值

 威尼斯人棋牌 10

  定义属性示例
<!ATTLIST 页面作者 
         姓名 CDATA #IMPLIED 
         年龄 CDATA #IMPLIED 
         联系信息 CDATA #REQUIRED 
         网站职务 CDATA #FIXED "页面作者" 
         个人爱好 CDATA "上网"
       > 

  

属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)

 

<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
    <!ELEMENT 肉 EMPTY>
    <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]> 
<购物篮>
    <肉 品种="鱼肉"/>
    <肉 品种="牛肉"/>
    <肉/>
</购物篮>

表示属性的设置值为一个唯一值。

ID 属性的值只能由字母,下划线开始,不能出现空白字符

 

?xml version = "1.0" encoding="GB2312" ?>

<!DOCTYPE 联系人列表[
    <!ELEMENT 联系人列表 ANY>
    <!ELEMENT 联系人(姓名,EMAIL)>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>
    <!ATTLIST 联系人 编号 ID #REQUIRED>
]>

<联系人列表>
    <联系人 编号=“p1">
        <姓名>张三</姓名>
        <EMAIL>zhang@it315.org</EMAIL>
     </联系人>
    <联系人 编号=“p2">
        <姓名>李四</姓名>
        <EMAIL>li@it315.org</EMAIL>
    </联系人>
</联系人列表>

实体定义 

  实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。

  在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。

  <!ENTITY 别名 “值”>

  在元素中引用 &别名; 

  定义引用实体 

   概念:在DTD中定义,在XML中使用

   语法:<!ENTITY 实体名称 “实体内容”>

   引用方式(注意是在XML中使用):&实体名称;

   

  DTD中定义: <!ENTITY copyright “博客园版权所有”>

  XML中引用: ©right;

 

XML约束之Schema

Schema概述:

XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性

  XML Schema vs DTD:

  XML Schema符合XML语法结构。

  DOM、SAX等XML API很容易解析出XML Schema文档中的内容。

  XML Schema对名称空间支持得非常好。

  XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。

  XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。

  XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。

  好处:

  XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。 XML Schema规定XML文档实例的结构和每个元素/属性的数据类型

  Schema相对于DTD的明显好处是,XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法

  Schema和DTD区别

XML从SGML中继承了DTD,并用它来定义内容的模型,验证和组织元素。同时,它也有很多局限:

  DTD不遵守XML语法; DTD不可扩展; DTD不支持命名空间的应用; DTD没有提供强大的数据类型支持,只能表示很简单的数据类型。

Schema完全克服了这些弱点,使得基于Web的应用系统交换XML数据更为容易。下面是它所展现的一些新特性:

  Schema完全基于XML语法,不需要再学习特殊的语法; Schema能用处理XML文档的工具处理,而不需要特殊的工具; Schema大大扩充了数据类型,支持booleans、numbers、dates and times、URIs、integers、decimal numbers和real numbers等; Schema支持原型,也就是元素的继承。如:我们定义了一个“联系人”数据类型,然后可以根据它产生“朋友联系人”和“客户联系”两种数据类型; Schema支持属性组。我们一般声明一些公共属性,然后可以应用于所有的元素,属性组允许把元素、属性关系放于外部定义、组合; 开放性。原来的DTD只能有一个DTD应用于一个XML文档,现在可以有多个Schema运用于一个XML文档。

本文由威尼斯人棋牌发布于计算机教程,转载请注明出处:当Java遇到XML 的邂逅 dom4j