当Java遇到XML 的邂逅+dom4j

XML简介:

XML:可扩展标记语言!

  01.很象html

  02.着重点是数据的保存

  03.无需预编译

  04.符合W3C标准

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

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

       int  num=5;  教材编号

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>

注意点:

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

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

03.节点必须正确的嵌套

04.严格区分大小写

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

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

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

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

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

特殊字符:

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

CDATA区域:

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

 语法:

<![CDATA[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文件的方式:

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

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

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

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

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

DOM4J解析xml

1. 导入dom4j   jar包

解析代码:

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

DTD:

Document Type Definition(文檔類型定義)

01.规范我们的编码

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

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

ELEMENT :元素,关键字

school:元素名称

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

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

DTD文档使用方式:

01.内部DTD

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

02.外部DTD

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

02.内外部DTD

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

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解析的步骤

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏高性能服务器开发

这些年一直记不住的 Java I/O

阅读目录 参考资料 前言 从对立到统一,字节流和字符流 从抽象到具体,数据的来源和目的 从简单到丰富,使用 Decorator 模式扩展功能 Java 7 中引...

36550
来自专栏小灰灰

Java之写文件

java之写文件 上一篇写了java读取文件的各种操作姿势,这里也补一个写文件的工具类,比较简单 1. 读写类介绍 (和上一篇差不多) java读写文件的I...

36360
来自专栏微信公众号:Java团长

这些年一直记不住的 Java I/O

  该文中的内容来源于 Oracle 的官方文档。Oracle 在 Java 方面的文档是非常完善的。对 Java 8 感兴趣的朋友,可以从这个总入口 Java...

12620
来自专栏Android知识点总结

Java总结IO篇之File类和Properties类

打开颜色选择器 :读流I-->字符串分割-->字符串存入Map-->使用Map对象还原用户配置 修改配置时 :写流O-->创建Map对象-->字符...

19020
来自专栏日常分享

网络通信中基于套接字输入流和输出流的创建

  (2)由套接字对象Socket调用getInputStream()或getOutputStream()方法,分别返回具有套接字通信的基础输入流InputSt...

10720
来自专栏程序猿DD

程序员你为什么这么累【续】:编码习惯之工具类规范

一个项目不可能没有工具类,工具类的初衷是良好的,代码重用,但到了后面工具类越来越乱,有些项目工具类有几十个,看的眼花缭乱,还有不少重复。如何编写出好的工具类,我...

24760
来自专栏软件工程师成长笔记

Java判断计算机网络连接是否正常

35420
来自专栏Java编程

详细讲解Java中的IO流

1.java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流(node stream),其它的流则称为过滤器(f...

69800
来自专栏ml

javaSE之如何将一个文档显示出来(,txt,.doc,.....)

1 package DEMO ; 2 3 import java.io.File; 4 import java.io.FileInputStream...

31560
来自专栏Golang语言社区

io.Writer 解析

简介 io.Writer 跟 io.Reader 一样,都是 Interface 类型,功能非常强大,在任何需要写入数据,处理数据流的地方,我们都应该尽可能使用...

401120

扫码关注云+社区

领取腾讯云代金券