格式良好的XML文檔
- 必須有XML聲明語句
- 必須有且僅有一個根元素
- 標籤大小寫敏感
- 屬性值用雙引號
- 標籤成對
- 元素正確嵌套
- 標籤自定義,可以使用中文
- 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,解析步驟
- SAXReader sax = new SAXReader();
- Document doc = sax.read(file.xml);
- Element root =doc.getRootElement();
- Iterator iterator = root.elementIterator();
- 遍歷迭代器
###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 女