1. 程式人生 > >當Java遇到XML 的邂逅+dom4j

當Java遇到XML 的邂逅+dom4j

主程序 res 例子 targe 開發 完全 蘋果 保存xml dom

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 += "\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解析的步驟

當Java遇到XML 的邂逅+dom4j