格式良好的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 女