有一个Emp类,用于描述员工
代码如下:
/**
* 该类用于描述emp.xml文件中的员工
*/
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;
}
public String toString(){
return id+","+name+","+age+","+gender+","+salary;
}
}
代码一:
/**
* 使用DOM解析XML文件
*/
public class XMLDemo1 {
public static void main(String[] args) {
/**
* 解析XML文件的基本流程
* 1.创建SAXReader用来读取XML文件
* 2.指定xml文件使得SAXReader读取,并解析成文档对象Document
* 3.获取更元素
* 4.获取每一个元素,从而达到解析的目的
*/
/**
* 常用的读取方法
* Docment read(InputStream in) 字节流
* Docment read(Reader read) 字符流
* Docment read(File file) 文件对象
*/
SAXReader reader = new SAXReader();
File fileXml = new File("emp.xml");
try {
Document doc = reader.read(fileXml);
Element root = doc.getRootElement();
/**
* Element element(String name)
* 获取当前标签下第一个名为给定名字的标签
*
* List elements(String name)
* 获取当前标签下所有给定名字的标签
*
* List eleemnts()
* 获取当前标签下所有的子标签
*
* String elementText(Stirng name)
* 获取当前标签中名为给定名字的子标签中间的文本
*
* Attribute attribute(String name)
* 获取当前标签中指定名字的属性
*
* String getName()
* 获取属性的名字
*
* String getValue
* 获取属性的值
*
*/
List<Emp> list = new ArrayList<Emp>();
List<Element> listXml = root.elements("emp");
for(Element emp : listXml){
Attribute att = emp.attribute("id");
int id = Integer.parseInt(att.getValue());
String name = emp.elementText("name");
int age = Integer.parseInt(emp.elementText("age"));
String gender = emp.elementText("gender");
int salary = Integer.parseInt(emp.elementText("salary"));
list.add(new Emp(id,name,age,gender,salary));
}
System.out.println("解析了"+list.size()+"个员工信息");
//输出每个员工的信息
for(Emp e : list){
System.out.println(e);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
测试结果如下:
解析了5个员工信息
1,张三,34,男,3000
2,李四,21,女,4000
3,王五,46,女,6500
4,赵六,28,男,4400
5,钱七,53,男,12000
*************************************************************************************************************************************
代码二:
/**
* 使用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,"男",5500));
list.add(new Emp(3,"marry",22,"女",3500));
list.add(new Emp(4,"kate",25,"女",6000));
list.add(new Emp(5,"tom",31,"男",8500));
/**
* 生成一个XML文件的基本步骤
* 1.创建文档对象Document
* 2.为Document添加根节点
* 3.为根节点组建树状结构
* 4.创建XMLWriter
* 5.为XMLWriter指定写出目标
* 6.写出xml
*/
Document doc = DocumentHelper.createDocument();
/**
* Document的方法
* Element addElement(String name)
* 该方法用于向文档中添加给定名字的根元素,返回的Element实例就表示该根元素
* 需要注意的是,该方法只能调用一次,调用第二次会抛出异常
*
* Element addElement(String name)
* 向当前标签中添加给定名字的子标签
*/
Element root = doc.addElement("list");
//循环添加每一个员工信息
for(Emp e : list){
Element emp = root.addElement("emp");
/**
* Element addAttribute(String name,String value)
* 为当前标签添加给定名字以及对应值的属性,返回值任然为当前标签
* 这样做的目的是可以连续添加若干属性
*/
emp.addAttribute("id", String.valueOf(e.getId()));
Element name = emp.addElement("name");
name.setText(e.getName());//addText()方法是在原有字符串后追加
emp.addElement("age").setText(String.valueOf(e.getAge()));
emp.addElement("gender").addText(e.getGender());
emp.addElement("salary").addText(String.valueOf(e.getSalary()));
}
/**
* 当退出循环后,那么Document中的结构就已经建完了,需要将其写出为xml
*/
XMLWriter writer = null;
FileOutputStream out = null;
try {
writer = new XMLWriter(
new FileOutputStream("myemp.xml"),
OutputFormat.createPrettyPrint()
);
/**
* 将Document对象写出到文件中、这时会将Document转换为xml格式写入文件
*/
writer.write(doc);
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if(writer != null){
try {
writer.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
测试结果如下:
<?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>5500</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>31</age>
<gender>男</gender>
<salary>8500</salary>
</emp>
</list>
**************************************************************************************************************
代码三:/**
* DOM4J对XPatch的支持
*/
public class XMLDemo3 {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(new File("myemp.xml")) ;
/**
* List selectNodes(String xpath)
* 根据给定的xpath查询对应的节点
*/
// String path = "/list/emp[salary>5000]";//工资大于5000的人
// String path = "/list/emp[gender='女']/salary[.>4000]";//工资大于4000的女同志的工资
String path = "/list/emp[gender='女' and age>20]/salary";//女同志中年龄大于24岁的工资
List list = doc.selectNodes(path);//List不用添加泛型,因为xpath除了获取标签之外还有属性,根据获取的内容强转即可
for(Object o : list){
Element e = (Element) o;
System.out.println(e.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}