Java SE ------- XML(小解--上)

1.導入dom4j和jaxen
打開pom.xml複製以下代碼保存即可自動安裝

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>tedu.cn</groupId>
  <artifactId>JSD1604_XML</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  	<dependency>
	    <groupId>dom4j</groupId>
	    <artifactId>dom4j</artifactId>
	    <version>1.6.1</version>
	</dependency>
  	<dependency>
	    <groupId>jaxen</groupId>
	    <artifactId>jaxen</artifactId>
	    <version>1.1.4</version>
	</dependency>
  </dependencies>
</project>

2.創建一個emplist.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<list>
	<emp id="1">
		<name>張三</name>
		<age>18</age>
		<gender></gender>
		<salary>3000</salary>
	</emp>
	<emp id="2">
		<name>李四</name>
		<age>18</age>
		<gender></gender>
		<salary>3000</salary>
	</emp>
	<emp id="3">
		<name>張發三</name>
		<age>18</age>
		<gender></gender>
		<salary>3000</salary>
	</emp>
	<emp id="4">
		<name>法競三</name>
		<age>18</age>
		<gender></gender>
		<salary>3000</salary>
	</emp>
	<emp id="5">
		<name>張給</name>
		<age>18</age>
		<gender></gender>
		<salary>3000</salary>
	</emp>
	<emp id="6">
		<name>帆帆</name>
		<age>18</age>
		<gender></gender>
		<salary>5000</salary>
	</emp>
	
</list>

3.創建一個emp.java的類調用emp.xml

package day12;
/**
 * 該類用於表示xml文檔中的一個員工信息
 * @author Acer
 *
 */
public class Emp {

	private int id;
	private String name;
	private int age;
	private String gender;
	private int salary;
	public Emp() {
		
	}
	
	
	public Emp(int id, String name, int age, String gender, int salary) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.salary = salary;
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	@Override
	public String toString() {
		return "Emp [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", salary=" + salary + "]";
	}
	
	
}

3.使用Dom解析xml文檔,創建一個PraseXmlDemo.java解析emplist.xml

package day12;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import javax.management.Attribute;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 使用Dom解析xml文檔
 * @author Acer
 *
 */
public class ParseXmlDemo {

	public static void main(String[] args) {
		/*
		 * 解析emplist.xml文檔,將所有的員工
		 * 信息讀取出來並轉換成若干emp實例
		 * 存入一個list集合中
		 * 
		 * 解析XML的流程:
		 * 1.創建SAXReader
		 * 2.使用SAXReader讀取XML文檔並返回
		 * 	Document對象
		 * 	這一步就是DOM解析耗時耗資源的體現
		 * 	因爲DOM會將XML文檔全部讀取並以一個Document
		 * 	對象的形式存於內存。
		 * 	Document對象用於描述解析的XML文檔內容。
		 * 3.根據Document對象回去根元素
		 * 4.按照xml的結構從根元素中開始逐級獲取子元素
		 * 	以達到便利xml的目的
		 * 
		 */
		try {
			//1
			SAXReader reader = new SAXReader();
			//2
			Document doc = reader.read(
					new FileInputStream("emplist.xml"));
			/*
			 * 3.獲取根元素
			 * Element的每一個實例用於表示xml文檔
			 * 中的一個元素(一堆標籤)
			 * 這裏獲取的相當於式emplist.xml文檔中的
			 * <list>標籤 
			 */
			Element root = doc.getRootElement();
			/*
			 * 
			 * Element提供了獲取元素的相關方法
			 * 
			 * String getName()
			 * 獲取當前標籤的名字
			 * 
			 * List elements()
			 * 獲取當前標籤下的所有子標籤
			 * 
			 * List elements(String name)
			 * 獲取當前標籤下所有同名子標籤
			 * 
			 * Element element(String name)
			 * 獲取指定名字的子標籤
			 * 
			 * Attribute attribute(String name)
			 * 獲取指定名字的屬性
			 * 
			 * String getText()
			 * 獲取當前標籤中的文本(前標籤和後標籤中間的文本信息
			 * ,前提是確實爲文本而不是子標籤)
			 */
			List<Emp> emplist = new ArrayList<Emp>();
			/*
			 * 獲取根標籤<list>下面的所有子標籤<emp>
			 */
			List<Element> elements = root.elements();
			/*
			 * 遍歷所有<emp>標籤並解析出該員工相關信息並一個Emp
			 * 實例保存然後將其存入emplist集合
			 * 
			 */
			for(Element empEle : elements) {
				//獲取名字
				Element nameEle = empEle.element("name");
				String name = nameEle.getTextTrim();
				//獲取age
				int age = Integer.parseInt(
						empEle.elementTextTrim("age"));
				String gender = 
						empEle.elementTextTrim("gender");
				int salary = Integer.parseInt(
						empEle.elementTextTrim("salary")); 
				/*
				 * 獲取emp標籤中的id屬性
				 * Attribute的每一個實例用於表示一個屬性信息
				 * 常用的方法:
				 * String getName()獲取當前屬性名
				 * String getValue()獲取當前屬性值
				 */
				org.dom4j.Attribute attr = empEle.attribute("id");
				int id = Integer.parseInt(
						(String) attr.getValue());
				Emp emp = new Emp(
						id, name, age, gender, salary);
				emplist.add(emp);
			}
			System.out.println("解析完畢!");
			System.out.println("共"+emplist.size()+"個員工");
			for(Emp emp1 : emplist) {
				System.out.println(emp1);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

4.使用DOM生成xml文檔,創建WriterXmlDemo.java文件生成myemp.xml

package day12;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Writer;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.RowSetInternal;
import javax.sql.rowset.WebRowSet;
import javax.sql.rowset.spi.XmlWriter;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

/**
 *  使用DOM生成xml文檔
 * @author Acer
 *
 */
public class WriteXmlDemo {

	public static void main(String[] args) {
		List<Emp> emplist = 
				new ArrayList<Emp>();
		emplist.add(new Emp(1,"阿飛",23,"男",2300));
		emplist.add(new Emp(2,"阿他",22,"女",25300));
		emplist.add(new Emp(3,"阿發",82,"男",2300));
		emplist.add(new Emp(4,"給飛",22,"女",42300));
		emplist.add(new Emp(5,"阿就",252,"男",2300));
		emplist.add(new Emp(6,"額外飛",22,"男",8800));
		
		/*
		 * 將emplist集合中的員工信息保存到
		 * myemp.xml文檔中
		 * 
		 * 寫出XML文檔的大致步驟:
		 * 1.創建一個Document對象表示一個空白的xml文檔
		 * 2.向Document對象中添加根元素
		 * 3.按照應當生成的xml文檔的格式逐級向根元素中
		 * 添加子元素以形成xml文檔格式
		 * 4.創建xmlwriter
		 * 5.通過xmlwriter將Document寫出
		 */
		XMLWriter writer = null;
		try {
			//1
			Document document = 
					DocumentHelper.createDocument();
			/*
			 * 2添加跟標籤<list>
			 * Document提供了添加根元素的方法
			 * 
			 * Element addElement(String name)
			 * 該方法可以向當前文檔中添加給定名字的根元素,並添加
			 * 進去的該元素以一個Element實力返回,以便於對的該元素 
			 * 繼續操作
			 * 需要注意,該方法只能調用一次,應爲一個文檔中只能有
			 * 一個根元素
			 * 
			 */
			Element root = 
					document.addElement("list");
			/*
			 * 將emplist集合中的每個員工信息以一個
			 * <emp>標籤的形式保存到<list>標籤中
			 * 
			 */
			for(Emp emp : emplist) {
				/*
				 * Element提供了相關方法:
				 * 
				 * Element addElement(String name)
				 * 向當前標籤中添加給定名字的子標籤
				 * 並將其返回,以便繼續操作
				 * 
				 * Element addTest(String text)
				 * 向當前標籤中添加文本信息,返回值爲當前標籤
				 * 
				 * Element addAttribute(
				 * 		String name, String value)
				 * 向當前標籤中添加屬性,返回值爲當前標籤
				 */
				//向根標籤<list>中添加子標籤<emp>
				Element empEle = 
						root.addElement("emp");
				//向<emp>標籤添加<name>標籤
				Element nameEle = 
						empEle.addElement("name");
				nameEle.addText(emp.getName());
				//向<emp>標籤添加<age>標籤
				empEle.addElement("age").addText(
						emp.getAge()+"");
				//向<emp>標籤添加<gender>標籤
				Element genderEle = 
						empEle.addElement("gender");
				genderEle.addText(emp.getGender());
				//向<emp>標籤添加<salary>標籤
				Element salaryEle = 
						empEle.addElement("salary");
				salaryEle.addText(emp.getSalary()+"");
				
				//添加屬性:id
				empEle.addAttribute("id", emp.getId()+"");
			}
			FileOutputStream fos = 
					new FileOutputStream("myemp.xml");
			writer = new XMLWriter(fos,OutputFormat.createPrettyPrint());
			writer.write(document);
			System.out.println("寫出完畢!");
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally {
			if(writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		}
	}
}

生成 的myemp.xml文件:

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

<list>
  <emp id="1">
    <name>阿飛</name>
    <age>23</age>
    <gender></gender>
    <salary>2300</salary>
  </emp>
  <emp id="2">
    <name>阿他</name>
    <age>22</age>
    <gender></gender>
    <salary>25300</salary>
  </emp>
  <emp id="3">
    <name>阿發</name>
    <age>82</age>
    <gender></gender>
    <salary>2300</salary>
  </emp>
  <emp id="4">
    <name>給飛</name>
    <age>22</age>
    <gender></gender>
    <salary>42300</salary>
  </emp>
  <emp id="5">
    <name>阿就</name>
    <age>252</age>
    <gender></gender>
    <salary>2300</salary>
  </emp>
  <emp id="6">
    <name>額外飛</name>
    <age>22</age>
    <gender></gender>
    <salary>8800</salary>
  </emp>
</list>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章