• 当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.空格和换行都是特殊字符 会被解析器解析

    xmlhtml都是一个类似于倒挂的树!

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

    我们把这个倒挂的树称之为===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 += "	";
            }
            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解析的步骤

  • 相关阅读:
    selenium浏览器参数设置详解——转
    py打包工具
    BurpSuite暴力破解和防御实战
    费马小定理(确定n 是否为素数)
    如何实现一个RPC框架1 —— RPC简介和通信协议的定义
    如何实现一个RPC框架2 ——用Netty实现协议通信
    15.三数之和
    flex开发零碎笔记,随时补充
    转“国内图片网站Yupoo的架构”
    转“经验分享:大型高并发高负载网站的系统架构 ”
  • 原文地址:https://www.cnblogs.com/lsy131479/p/9241767.html
Copyright © 2020-2023  润新知