Day20190528:XML可擴展標記語言

格式良好的XML文檔

  • 必須有XML聲明語句
  • 必須有且僅有一個根元素
  • 標籤大小寫敏感
  • 屬性值用雙引號
  • 標籤成對
  • 元素正確嵌套
  • 標籤自定義,可以使用中文
  1. XML文件有多種解析方式:
  • DOM解析 (SUN公司內置)
  • SAX解析(安卓開發)
  • JDOM
  • DOM4J解析

XML技術的用途:

  • 充當顯示數據(以XML充當顯示層)
  • 存儲數據(存儲層)的功能
  • 以XML描述數據,並在聯繫服務器與系統及其他部分之間傳遞

dom4j是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在對主流的Java XML API進行的性能、功能和易用性的評測,dom4j無論在哪個方面都是非常出色的。如今你可以看到越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這是必須使用的jar包,Hibernate用它來讀寫配置文件。

DOM4J解析XML,解析步驟

  1. SAXReader sax = new SAXReader();
  2. Document doc = sax.read(file.xml);
  3. Element root =doc.getRootElement();
  4. Iterator iterator = root.elementIterator();
  5. 遍歷迭代器

 

###XML文檔

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student id="1">
		<name>萊昂納多</name>
		<age>54</age>
		<sex>男</sex>
	</student>
	<student id="2">
		<name>周星馳</name>
		<age>56</age>
		<sex>男</sex>
	</student>
	<student id="3">
		<name>岡本多緒</name>
		<age>28</age>
		<sex>女</sex>
	</student>
</students>

###查

package com.YL.xml01;

import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ReadXML {

	public static void main(String[] args) throws Exception {
		
		//創建解析器對象
		SAXReader reader = new SAXReader();
		//讀取.xml文件,返回document文件
		Document document = reader.read("src/student.xml");
		//獲取根節點
		Element root = document.getRootElement();
		//獲取子節點,存入list集合中
		List<Element> childs = root.elements();
		//查詢.xml中子節點個數
		System.out.println("子節點個數爲:"+childs.size());
		
		//遍歷子節點對象
		for(Element c:childs) {
			//獲取每個元素的屬性對象
			Attribute attribute = c.attribute("id");
			//獲取屬性對應的值
			String value = attribute.getText();
			System.out.println("id = " +value);
			//獲取每個結點下子節點的集合
			List<Element> elements = c.elements();
			
			for(Element element:elements) {
				String name = element.getName();//獲取標籤
				String text = element.getText();//獲取內容
				System.out.println(name+"--"+text);
			}
			System.out.println("=====================");			
		}
	}
}

 

 

###增

public class AddXml {

	public static void main(String[] args) throws Exception{
		//創建解析器對象
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/student.xml");
		Element root = document.getRootElement();

		//輸入需要增加的信息
		Scanner scan = new Scanner(System.in);
		System.out.println("請輸入id:");
		String id = scan.next();
		System.out.println("請輸入姓名:");
		String name = scan.next();
		System.out.println("請輸入性別:");
		String sex = scan.next();
		System.out.println("請輸入年齡:");
		String age = scan.next();

		//根節點下新增一個子節點
		Element stuElement = root.addElement("student");
		stuElement.addAttribute("id", String.valueOf(id));
		//創建name標籤
		Element addName = stuElement.addElement("name");
		addName.setText(name);
		//創建age標籤
		Element addAge = stuElement.addElement("age");
		addAge.setText(String.valueOf(age));
		//創建sex
		Element addSex = stuElement.addElement("sex");
		addSex.setText(sex);


		//保存-固定格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("GBK");
		XMLWriter writer = new XMLWriter(new FileWriter("src/student.xml"),format);
		writer.write(document);
		writer.close();

		System.out.println("新增成功!!!");


	}
}
請輸入id:
4
請輸入姓名:
人民的名義
請輸入性別:
男
請輸入年齡:
48
新增成功!!!
<?xml version="1.0" encoding="GBK"?>

<students> 
  <student id="1"> 
    <name>萊昂納多</name>  
    <age>54</age>  
    <sex>男</sex> 
  </student>  
  <student id="2"> 
    <name>周星馳</name>  
    <age>56</age>  
    <sex>男</sex> 
  </student>  
  <student id="3"> 
    <name>岡本多緒</name>  
    <age>30</age>  
    <sex>女</sex> 
  </student>  
  <student id="4">
    <name>人民的名義</name>
    <age>48</age>
    <sex>男</sex>
  </student>
</students>

 

###刪

public class DelXml {

	public static void main(String[] args) throws Exception{
		
		/**
		 * 根據id刪除元素
		 */
		
		System.out.println("輸入要刪除的id號:");
		Scanner scan = new Scanner(System.in);
		int idNum = scan.nextInt();
		
		//創建解析器對象
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/student.xml");
		Element root = document.getRootElement();//獲取根節點
		
		List<Element> list = root.elements();//取出根節點下的子節點
		
		//遍歷找出id
		for (Element element : list) {
			Attribute attribute = element.attribute("id");
			String id = attribute.getText();
			if(String.valueOf(idNum).equals(id)) {
				root.remove(element);//父節點刪除子節點
				System.out.println("刪除成功!!!");
			}
			
		}
		//保存
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("GBK");
		XMLWriter writer = new XMLWriter(new FileWriter("src/student.xml"),format);
		writer.write(document);
		writer.close();
		
	}
}
輸入要刪除的id號:
4
刪除成功!!!
<?xml version="1.0" encoding="GBK"?>

<students> 
  <student id="1"> 
    <name>萊昂納多</name>  
    <age>54</age>  
    <sex>男</sex> 
  </student>  
  <student id="2"> 
    <name>周星馳</name>  
    <age>56</age>  
    <sex>男</sex> 
  <

 

###改

public class UpdataXml {

	public static void main(String[] args) throws Exception{
		/**
		 * 輸入要修改元素的id,將其年齡加1
		 */
		//創建解析器對象
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/student.xml");
		Element root = document.getRootElement();

		//輸入要更新的信息:id=1,age+1
		Scanner scan = new Scanner(System.in);
		System.out.println("輸入要修改的元素的id:");
		int id = scan.nextInt();

		List<Element> list = root.elements();
		//遍歷找到該元素
		for (Element element : list) {
			Attribute attribute = element.attribute("id");
			String value = attribute.getText();
			if(value.equals(String.valueOf(id))) {
				List<Element> list2 = element.elements();
				for (Element element2 : list2) {
					if("age".equals(element2.getName())) {
						String age = element2.getText();
						System.out.println("修改之前的年齡:"+age);
						element2.setText(String.valueOf(Integer.parseInt(age)+1));
						System.out.println("修改之後的年齡:"+element2.getText());
					}
				}
			}

		}

		//保存
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("GBK");
		XMLWriter writer = new XMLWriter(new FileWriter("src/student.xml"),format);
		writer.write(document);
		writer.close();
		System.out.println("更新成功!!!");


	}
}
輸入要修改的元素的id:
2
修改之前的年齡:56
修改之後的年齡:57
更新成功!!!

 

###封裝成對象

public class Student {
	private String id;
	private String name;
	private int age;
	private String sex;
	public Student() {
		super();
	}
	public Student(String id,String name, int age, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	
	/**
	 * @return id
	 */
	public String getId() {
		return id;
	}
	/**
	 * @param id 要設置的 id
	 */
	public void setId(String id) {
		this.id = id;
	}
	/**
	 * @return name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name 要設置的 name
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return age
	 */
	public int getAge() {
		return age;
	}
	/**
	 * @param age 要設置的 age
	 */
	public void setAge(int age) {
		this.age = age;
	}
	/**
	 * @return sex
	 */
	public String getSex() {
		return sex;
	}
	/**
	 * @param sex 要設置的 sex
	 */
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	
}
public class XmlPackage {

	public static void main(String[] args) throws Exception{
		List<Student> student = getStudent();
		System.out.println("編號"+"\t"+"姓名"+"\t"+"年齡"+"\t"+"性別");
		for (Student s : student) {
			System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getSex());
		}

	}
	public static List<Student> getStudent() throws Exception{

		List<Student> list = new ArrayList<>();

		//創建解析器對象
		SAXReader reader = new SAXReader();
		Document document = reader.read("src/student.xml");
		Element root = document.getRootElement();

		//獲取子節點,存入list集合中
		List<Element> childs = root.elements();

		//循環獲取元素
		for(Element c:childs) {
			//新建一個學生對象
			Student student = new Student();
			//獲取每個元素的屬性對象
			Attribute attribute = c.attribute("id");
			//獲取屬性對應的值
			String value = attribute.getText();
			student.setId(value);
			List<Element> elements = c.elements();

			for(Element element:elements) {
				String nodeName = element.getName();//獲取標籤
				String nodeValue = element.getText();//獲取內容
				if("name".equals(nodeName)) {
					student.setName(nodeValue);
				}
				if("age".equals(nodeName)) {
					student.setAge(Integer.parseInt(nodeValue));
				}
				if("sex".equals(nodeName)) {
					student.setSex(nodeValue);
				}
			}
			list.add(student);
		}
		return list;
	}
}
編號	   姓名	        年齡	    性別
1	  萊昂納多	54	    男
2	  周星馳  	57	    男
3	  岡本多緒	30	    女

 

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