您的位置:首页 > 编程语言 > Java开发

java读写XML文件 (DOM)

2015-09-25 09:44 519 查看
首先项目里添加2个jar包,jar包名如下:

dom4j-1.6.1.jar

jaxen-1.1.1.jar

emp.xml

<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>张三</name>
<age>34</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="2">
<name>李四</name>
<age>21</age>
<gender>女</gender>
<salary>4000</salary>
</emp>
<emp id="3">
<name>王五</name>
<age>46</age>
<gender>女</gender>
<salary>6500</salary>
</emp>
<emp id="4">
<name>赵六</name>
<age>28</age>
<gender>男</gender>
<salary>4400</salary>
</emp>
<emp id="5">
<name>钱七</name>
<age>53</age>
<gender>男</gender>
<salary>12000</salary>
</emp>
</list>


myemp.xml

<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>jack</name>
<age>33</age>
<gender>男</gender>
<salary>5000</salary>
</emp>
<emp id="2">
<name>boss</name>
<age>55</age>
<gender>男</gender>
<salary>55000</salary>
</emp>
<emp id="3">
<name>marry</name>
<age>22</age>
<gender>女</gender>
<salary>3500</salary>
</emp>
<emp id="4">
<name>kate</name>
<age>25</age>
<gender>女</gender>
<salary>6000</salary>
</emp>
<emp id="5">
<name>tom</name>
<age>32</age>
<gender>男</gender>
<salary>8500</salary>
</emp>
</list>


Emp.class

package day20150924;
/**
* 该类用于描述emp.xml文件中表示的员工
* 子类方法具备多态(假设Person和Son都有age属性和run方法)
* Person p = new Son();
* p.run();//调用子类方法
* 属性不具备多态
* p.age;//调用父类属性
*/
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 id+","+name+","+age+","+gender+","+salary;
}

}


package day20150924;

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

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

/**
* 使用DOM解析XML文件
*/
public class XMLDemo1 {
public static void main(String[] args) {
try{
/*
* 解析XML文件的基本流程
* 1:创建SAXReader,用来读取XML文件
* 2:指定XML文件使得SAXReader读取,并解析文档对象Document
* 3:获取根元素
* 4:获取每一个元素,从而达到解析的目的
*/
//1:创建SAXReader,用来读取XML文件
SAXReader reader = new SAXReader();//带Reader都是字符流
//2:指定XML文件使得SAXReader读取,并解析文档对象Document
File xmlFile = new File("emp.xml");
/*
* 常用的读取方法:
* Document read(InputStream in)
* Document read(Reader read)
* Document read(File file)

* read方法的作用:
* 读取给定的xml,并将其解析转换为一个Document对象,
* 实际上这里已经完成了对整个xml的解析工作,
* 并将所有的内容封装到了Document对象中。
* Document对象可以描述当前xml文档
*/
Document doc = reader.read(xmlFile);
//3:获取根元素,拿到list元素
Element root = doc.getRootElement();
//4 获取每个元素
/*
* Element element(String name)
* 获取当前标签下的第一个给定名字的标签
*
* List elements(String name)
* 获取当前标签下所有给定名字的标签
*
* List elements()
* 获取所有子标签
*/
List<Element> elements = root.elements("emp");
/*
* 创建集合,保存xml中每个用户的信息,然后创建Emp实例,
* 将信息设置到该实例的相应属性上。
* 最终将所有emp对象存入该集合
*/
List<Emp> list = new ArrayList<Emp>();
/*
* 遍历每个emp标签
*/
for(Element emp : elements){
Emp e = new Emp();
//解析emp标签
//获取name的值
Element ename = emp.element("name");
//获取前后标签中的文本
String name = ename.getTextTrim();
//获取年龄
/*
* String elementText(String name)
* 获取当前标签中给定名字的子标签中间的文本
* 该方法与上面取得name的两句话等效
*/
int age = Integer.parseInt(emp.elementText("age"));
String gender = emp.elementText("gender");
int salary = Integer.parseInt(emp.elementText("salary"));
e.setName(name);
e.setAge(age);
e.setGender(gender);
e.setSalary(salary);
//获取id属性
Attribute attr = emp.attribute("id");
/*
* Attribute表示一个属性,常用方法:
* String getValue():获取该属性的值
* String getName():获取该属性的名字
*/
int id = Integer.parseInt(attr.getValue());
e.setId(id);
list.add(e);
}
System.out.println("解析了"+list.size()+"个员工信息");
for(Emp emp : list){
System.out.println(emp);
}
}catch(Exception e){

}
}

}


package day20150924;

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

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

/**
* 使用DOM写出一个XML
*/
public class XMLDemo2 {

public static void main(String[] args) {
List<Emp> list = new ArrayList<Emp>();
list.add(new Emp(1,"jack",33,"男",5000));
list.add(new Emp(2,"boss",55,"男",55000));
list.add(new Emp(3,"marry",22,"女",3500));
list.add(new Emp(4,"kate",25,"女",6000));
list.add(new Emp(5,"tom",32,"男",8500));
/*
* 生成一个xml的基本步骤:
* 1:创建文档对象Document
* 2:为Document创建根节点
* 3:为跟节点组建树状结构
* 4:创建XMLWriter
* 6:写出XML
*/
//1:创建文档对象Document
Document doc = DocumentHelper.createDocument();
//2:为Document创建根节点
/*
* Document的方法
* Element addElement(String name)
* 该方法用于向文档中添加给定名字的根元素,返回的Element实例就表示该根元素
* 注意:该方法只能调用一次,调用第二次会抛出异常
*/
Element root = doc.addElement("list");
//循环添加每个员工信息
//for(int i=0;i<list.size();i++){}
for(Emp e : list){
/*
* Element同样支持方法:
* Element  addElement(String name)
* 想当前标签中添加给定名字的子标签
*/
//向根标签中添加emp标签
Element emp = root.addElement("emp");
//向emp标签中添加子标签name
Element name = emp.addElement("name");
name.setText(e.getName());//setText:设置;  AddText:现有内容上追加
emp.addElement("age").setText(e.getAge()+"");
emp.addElement("gender").addText(e.getGender());
emp.addElement("salary").addText(e.getSalary()+"");
/*
* 为标签添加属性
* Element addAttribute(String name,String value)
* 为当前标签添加名字和对应的值,
* 返回值仍然是当前标签。
* 这样可以连续添加若干属性,就像StringBuilder的append的返回值效果和作用
*/
emp.addAttribute("id", e.getId()+"");
}
/*
* 当退出循环后,那么Document中的结构就构建完 了。
* 需要将其写出为xml
*/
try{
XMLWriter writer = new XMLWriter();
FileOutputStream out = new FileOutputStream("myemp.xml");
writer.setOutputStream(out);
/*
* 将Document对象写出到文件中,
* 这时会将Document转换为xml格式,写入文件
*/
writer.write(doc);
}catch(Exception e){
}
}

}


package day20150924;

import java.io.File;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* DOM4J对XPath的支持
*/
public class XMLDemo3 {
public static void main(String[] args){
try{
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("myemp.xml"));
//          String path = "/list/emp[salary>5000]";
String path2 = "/list/emp/@id";//或者 "//@id"
//          String path = "/list/emp[gender='女']";
//String path = "/list/emp[gender='女']/salary";
String path = "/list/emp[gender='女']/salary[.>4000]";
/*
* List selectNodes(String xpath)
* 根据给定的XPATH查询对应的节点
*/
List list = doc.selectNodes(path);//返回Element集合
List list2 = doc.selectNodes(path2);//返回Attribute集合
for(Object o : list){
Element e = (Element)o;
String value = e.getStringValue();
System.out.println(value);
}
for(Object o : list2){
Attribute a = (Attribute)o;
String value = a.getStringValue();
String name = a.getName();
System.out.println(name+",,,"+value);
}
}catch(Exception e){

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: