一. 前言
又有很长时间没有用xml了,趁着有点时间,把xml的解析又过了一遍,这里就一下,再加深一下印象。本文只是介绍xml基本的解析方式。
二. XML
XML 叫做可扩展标记语言。被用来传输和存储数据。是一个纯文本。
看到XML,是否都会想起HTML,不要搞混了,他们不是一个替代关系,而是各有不同。
XML 主要用于传输和存储数据,针对的是数据的内容。HTML是超文本标记语言,主要用于显示数据,针对的是数据的外观。他们虽然都是标记语言,但是XML的标记是自定义的,而HTML的都是规定好了的。
三. XML的解析
解析即为获取信息。
XML的解析基本分为两类,一种是SAX解析,一直是DOM解析。
SAX(Simple API for XML)是基于事件流的解析;
DOM(Document Object Model)是基于XML 文档树结构的解析。
SAX: 效率高,数据量小,仅一次获取,不能修改 。
DOM: 整颗树加载到内存中,耗内存,可多次获取,可修改。
本文将使用DOM的方式进行记录。
四. 读取XML
这里就直接记录XML的读取操作了,XML的基本知识点,如元素,根元素,属性,子元素,开闭标签等内容,就不再赘述了。
读取XML即在程序中读取XML文件,这里会用到SAXReader类,该类在dom4j的jar包中,因此需要导入该包。
具体代码如下:
实体类emp
public class Emp {
public String id;
public String name;
public String age;
public String gender;
public String salary;
public String getName() {
return name;
}
public String getAge() {
return age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getGender() {
return gender;
}
public String getSalary() {
return salary;
}
public void setName(String name) {
this.name = name;
}
public void setAge(String age) {
this.age = age;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setSalary(String salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Emp [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", salary=" + salary + "]";
}
public Emp() {
super();
}
public Emp(String id, String name, String age, String gender, String salary) {
super();
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.salary = salary;
}
}
读取xml
public class ReadXml {
public static void main(String[] args) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new FileInputStream("emps.xml"));
//获取根元素
Element root = document.getRootElement();
//存储xml的内容信息
List<Emp> emplist = new ArrayList<Emp>();
Emp emp = null;
//获取所有的emp
List<Element> emps = root.elements();
//循环获取每一个emp标签的子标签内容及属性,并存入集合中
for(Element e:emps){
String id = e.attributeValue("id");
String name = e.element("name").getTextTrim();
String age = e.elementTextTrim("age");
String gender = e.elementTextTrim("gender");
String salary = e.elementTextTrim("salary");
emp = new Emp(id,name,age,gender,salary);
emplist.add(emp);
}
System.out.println(emplist);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的emps.xml文件是放在根目录下的,因此此处直接这么写的。
输出结果如下:
[Emp [id=10002, name=张三, age=18, gender=男, salary=8000], Emp [id=10004, name=李四, age=19, gender=女, salary=9000], Emp [id=10005, name=王五, age=22, gender=男, salary=5000], Emp [id=10009, name=赵六, age=20, gender=女, salary=18000]]
五. 写出XML
因为本程序没有连接数据库,因此,此处将上面读取的操作再写了一次,将获取到的值写出到XML中。
public class WriteXml {
public static void main(String[] args) {
//获取xml信息
List<Emp> emplist = new ArrayList<Emp>();
try {
SAXReader reader = new SAXReader();
Document rdocument = reader.read(new FileInputStream("emps.xml"));
Element root = rdocument.getRootElement();
List<Element> emps = root.elements("emp");
Emp emp = null;
for(Element e :emps){
String id = e.attributeValue("id");
String name = e.elementTextTrim("name");
String age = e.elementTextTrim("age");
String gender = e.elementTextTrim("gender");
String salary = e.elementTextTrim("salary");
emp = new Emp(id,name,age,gender,salary);
emplist.add(emp);
}
} catch (Exception e) {
e.printStackTrace();
}
//写出xml信息
Document document = DocumentHelper.createDocument();
Element root = document.addElement("grades");
Element classs =root.addElement("classs");
classs.addAttribute("id", "1");
for(Emp e : emplist){
Element student = classs.addElement("student");
student.addAttribute("id", e.getId());
student.addElement("name").addText(e.getName());
student.addElement("age").addText(e.getAge());
student.addElement("gender").addText(e.getGender());
student.addElement("salary").addText(e.getSalary());
}
XMLWriter writer = null;
try {
FileOutputStream out = new FileOutputStream("grades.xml");
writer = new XMLWriter(out, OutputFormat.createPrettyPrint());
writer.write(document);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
writer.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
System.out.println("写出完毕!");
}
}
六. 总结
本篇内容简单,只是基本的操作xml文件,仅作记录,以供翻阅,因为现在总感觉记性不太好,很多简单的东西都记不住了,如有纰漏,望大家告之。