解析XML文件之Dom4J

XML資源:

Maven Repository-Dom4J:https://mvnrepository.com/artifact/dom4j/dom4j

Maven Repository-Jaxen:https://mvnrepository.com/artifact/jaxen/jaxen

XML實戰:

目標文件(resources/car.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<車輛清單>
    <汽車>
        <車牌 生產時間="2019">奧迪</車牌>
        <產地>北京</產地>
    </汽車>
    <汽車>
        <車牌 生產時間="2020">奔馳</車牌>
        <產地>上海</產地>
    </汽車>
</車輛清單>

讀取(Dom4jParseTest.java):

package com.example.test;

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 org.junit.Test;

import java.io.*;
import java.util.List;

public class Dom4jParseTest {
    private File file = new File(this.getClass().getClassLoader().getResource("car.xml").getPath());

    @Test
    public void dom4jRetrieve(){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(file);
            //顯示根元素的名稱
            Element rootElement = document.getRootElement();
            System.out.println(rootElement.getName());
            //取得根元素下的所有子元素
            List<Element> elements = rootElement.elements();
            System.out.println("根元素下子元素數量:" + elements.size());
            for (Element element:elements){
                //取得子元素的文本
                System.out.println("車牌:" + element.elementText("車牌"));
                System.out.println("產地:" + element.elementText("產地"));
                //取得子元素的屬性
                System.out.println("生產時間:" + element.element("車牌").attribute("生產時間").getValue());
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

增加-默認(Dom4jParseTest.java):

package com.example.test;

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 org.junit.Test;

import java.io.*;

public class Dom4jParseTest {
    private File file = new File(this.getClass().getClassLoader().getResource("car.xml").getPath());

    @Test
    public void dom4jAdd(){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(file);
            //取得根元素的第一個子元素
            Element firstElement = (Element)document.getRootElement().elements().get(0);
            //添加子元素“單價”並設置文本“30”
            firstElement.addElement("單價").setText("30");
            //寫入XML文件
            OutputStream outputStream = new FileOutputStream(file);
            OutputFormat outputFormat = OutputFormat.createPrettyPrint();
            XMLWriter xmlWriter = new XMLWriter(outputStream, outputFormat);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

結果文件(car.xml)

<?xml version="1.0" encoding="UTF-8"?>

<車輛清單> 
  <汽車> 
    <車牌 生產時間="2019">奧迪</車牌>  
    <產地>北京</產地>  
    <單價>30</單價>
  </汽車>  
  <汽車> 
    <車牌 生產時間="2020">奔馳</車牌>  
    <產地>上海</產地> 
  </汽車> 
</車輛清單>

增加-指定位置(Dom4jParseTest.java):

package com.example.test;

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

import java.io.*;
import java.util.List;

public class Dom4jParseTest {
    private File file = new File(this.getClass().getClassLoader().getResource("car.xml").getPath());

    @Test
    public void dom4jAdd(){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(file);
            //取得根元素下的所有子元素
            List<Element> elements = document.getRootElement().elements();
            //創建新元素
            Element element = DocumentHelper.createElement("汽車");
            element.setText("指定位置增加元素");
            //指定位置增加元素
            elements.add(1, element);
            //寫入XML文件
            OutputStream outputStream = new FileOutputStream(file);
            OutputFormat outputFormat = OutputFormat.createPrettyPrint();
            XMLWriter xmlWriter = new XMLWriter(outputStream, outputFormat);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

結果文件(car.xml)

<?xml version="1.0" encoding="UTF-8"?>

<車輛清單> 
  <汽車> 
    <車牌 生產時間="2019">奧迪</車牌>  
    <產地>北京</產地> 
  </汽車>  
  <汽車>指定位置增加元素</汽車>
  <汽車> 
    <車牌 生產時間="2020">奔馳</車牌>  
    <產地>上海</產地> 
  </汽車> 
</車輛清單>

更新(Dom4jParseTest.java):

package com.example.test;

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 org.junit.Test;

import java.io.*;

public class Dom4jParseTest {
    private File file = new File(this.getClass().getClassLoader().getResource("car.xml").getPath());

    @Test
    public void dom4jUpdate(){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(file);
            //取得根元素的第一個子元素
            Element firstElement = (Element)document.getRootElement().elements().get(0);
            //修改子元素文本爲“深圳”
            firstElement.element("產地").setText("深圳");
            //寫入XML文件
            OutputStream outputStream = new FileOutputStream(file);
            OutputFormat outputFormat = OutputFormat.createPrettyPrint();
            XMLWriter xmlWriter = new XMLWriter(outputStream, outputFormat);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

結果文件(car.xml)

<?xml version="1.0" encoding="UTF-8"?>

<車輛清單> 
  <汽車> 
    <車牌 生產時間="2019">奧迪</車牌>  
    <產地>深圳</產地> 
  </汽車>  
  <汽車> 
    <車牌 生產時間="2020">奔馳</車牌>  
    <產地>上海</產地> 
  </汽車> 
</車輛清單>

刪除(Dom4jParseTest.java):

package com.example.test;

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 org.junit.Test;

import java.io.*;

public class Dom4jParseTest {
    private File file = new File(this.getClass().getClassLoader().getResource("car.xml").getPath());

    @Test
    public void dom4jDelete(){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(file);
            //取得根元素的第一個子元素
            Element firstElement = (Element)document.getRootElement().elements().get(0);
            //刪除子元素
            firstElement.remove(firstElement.element("產地"));
            //寫入XML文件
            OutputStream outputStream = new FileOutputStream(file);
            OutputFormat outputFormat = OutputFormat.createPrettyPrint();
            XMLWriter xmlWriter = new XMLWriter(outputStream, outputFormat);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

結果文件(car.xml)

<?xml version="1.0" encoding="UTF-8"?>

<車輛清單> 
  <汽車> 
    <車牌 生產時間="2019">奧迪</車牌> 
  </汽車>  
  <汽車> 
    <車牌 生產時間="2020">奔馳</車牌>  
    <產地>上海</產地> 
  </汽車> 
</車輛清單>

創建(Dom4jParseTest.java):

package com.example.test;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

import java.io.*;

public class Dom4jParseTest {
    private File file = new File(this.getClass().getClassLoader().getResource("car.xml").getPath());

    @Test
    public void dom4jCreate(){
        try {
            //創建空的XML
            Document document = DocumentHelper.createDocument();
            //添加根元素
            document.addElement("root").setText("根元素");
            //寫入XML文件
            OutputStream outputStream = new FileOutputStream(file);
            OutputFormat outputFormat = OutputFormat.createPrettyPrint();
            XMLWriter xmlWriter = new XMLWriter(outputStream, outputFormat);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

結果文件(car.xml)

<?xml version="1.0" encoding="UTF-8"?>

<root>根元素</root>

String轉換爲XML(Dom4jParseTest.java):

package com.example.test;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

import java.io.*;

public class Dom4jParseTest {
    private File file = new File(this.getClass().getClassLoader().getResource("car.xml").getPath());

    @Test
    public void dom4jStringToXML(){
        try {
            String text = "<產地>上海</產地>";
            //String->XML
            Document document = DocumentHelper.parseText(text);
            //寫入XML文件
            OutputStream outputStream = new FileOutputStream(file);
            OutputFormat outputFormat = OutputFormat.createPrettyPrint();
            XMLWriter xmlWriter = new XMLWriter(outputStream, outputFormat);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

結果文件(car.xml)

<?xml version="1.0" encoding="UTF-8"?>

<產地>上海</產地>

XML轉換爲String(Dom4jParseTest.java):

package com.example.test;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.*;

public class Dom4jParseTest {
    private File file = new File(this.getClass().getClassLoader().getResource("car.xml").getPath());

    @Test
    public void dom4jXMLToString(){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(file);
            //取得根元素
            Element rootElement = document.getRootElement();
            //XML-String
            String xmlStr = rootElement.asXML();
            System.out.println(xmlStr);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

XPath定位(Dom4jParseTest.java):

package com.example.test;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.*;
import java.util.List;

public class Dom4jParseTest {
    private File file = new File(this.getClass().getClassLoader().getResource("car.xml").getPath());

    @Test
    public void dom4jXMLToString(){
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(file);
            //取得所有汽車的產地
            String xpath = "//產地";
            List<Element> elements = document.selectNodes(xpath);
            for (Element element:elements){
                System.out.println(element.getText());
            }

            //取得第一輛汽車的產地
            Element firstElement = (Element) document.selectSingleNode(xpath);
            System.out.println(firstElement.getText());

            //取得生產時間爲2020的車的車牌
            String xpath2020 = "//車牌[@生產時間='2020']";
            Element secondElement = (Element) document.selectSingleNode(xpath2020);
            System.out.println(secondElement.getText());
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

 

發佈了41 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章