一
解析XML
解析过程
/*
* 解析XML文件的基本流程*/
代码
1.1
用到的辅助类
package demoXml;
/**
* 该类用于描述emp.xml文件中表示的员工
* @author Administrator
*
*/
public class Emp {
private int id;
private String name;
private int age;
private String gender;
private int salary;
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 Emp(){
}
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;
}
}
解析代码
package demoXml;
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文件
* @author Administrator
*
*/
public class XMLDemo1 {
public static void main(String []args){
try{
/*
* 解析XML文件的基本流程
* 1:创建SAXReader,用来读取XML
* 文件
* 2:指定xml文件使得SAXReader读取,
* 并解析问文档对象Document
* 3:获取根元素
* 4:获取每一个元素,从而达到解析的
* 目的。
*/
//1
//org.dom4j.xxxx
SAXReader reader
= new SAXReader();
//2
/*
* 常用的读取方法
* Document read(InputStream in)
* Document read(Reader read)
* Document read(File file)
*/
File xmlFile
= new File("emp.xml");
//2
/*
* read方法的作用:
* 读取给定的xml,并将其解析转换为
* 一个Document对象。
* 实际上这里已经完成了对整个xml
* 解析的工作。并将所有内容封装到了
* Document对象中。
* Document对象可以描述当前xml文档
*/
Document doc
= reader.read(xmlFile);
//3
Element root
= doc.getRootElement();
//4
/*
* Element element(String name)
* 获取当前标签下第一个名为给定
* 名字的标签
*
* List elements(String name)
* 获取当前标签下所有给定名字的
* 标签
*
* List elements()
* 获取当前标签下的所有子标签。
*/
List elements
= root.elements();
/*
* 创建一个集合,用于保存xml中
* 的每一个用户信息。我们先将
* 用户信息取出,然后创建一个Emp
* 实例,将信息设置到该实例的相应
* 属性上。最终将所有emp对象存入
* 该集合。
*/
List list
= new ArrayList();
/*
* 遍历每一个emp标签
*/
for(Element emp : elements){
//创建一个Emp对象,用于保存信息
Emp e = new Emp();
//解析emp标签
//获取name的值
/*
* 首先,获取名为"name"的子标签
* 其次,获取前后标签中间的文本
*/
Element ename
= emp.element("name");
String name
= ename.getText();
//获取年龄
/*
* String elementText(String name)
* 获取当前标签中名为给定名字的子标签
* 中间的文本
* 该方法与上面获取“name”的两句话等效
*/
String ageStr
= emp.elementText("age");
int age
= Integer.parseInt(ageStr);
//解析性别
String gender
= emp.elementText("gender");
//解析工资
int salary
= Integer.parseInt(
emp.elementText("salary")
);
e.setAge(age);
e.setName(name);
e.setGender(gender);
e.setSalary(salary);
/*
* 通过Element获取元素属性
*
* Attribute attribute(String name)
* 获取当前标签中指定名字的属性
*/
//获取id属性
Attribute attr
= emp.attribute("id");
//获取该属性的值
/*
* Attribute表示一个属性,常用方法:
*
* String getValue()
* 获取该属性的值
*
* String getName()
* 获取该属性的名字
*/
int id =Integer.parseInt(
attr.getValue()
);
e.setId(id);
//将Emp对象存入集合
list.add(e);
}
System.out.println(
"解析了"+list.size()+
"个员工信息");
//输出每一个员工信息
for(Emp e : list){
System.out.println(e);
}
}catch(Exception e){
}
}
}
package demoXml;
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
* @author Administrator
*
*/
public class XMLDemo2 {
public static void main(String[] args){
List list
= new ArrayList();
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
* 5:为XMLWriter指定写出目标
* 6:写出xml
*/
//1
//通过DocumentHelper创建Document对象
Document doc
= DocumentHelper.createDocument();
//2
/*
* Document的方法
* Element addElement(String name)
* 该方法用于向文档中添加给定名字的
* 根元素,返回的Element实例就表示该
* 根元素
* 需要注意的是,该方法只能调用一次。
* 调用第二次会抛出异常。
*/
Element root
= doc.addElement("list");
/*
* 循环添加每一个员工信息
*/
for(Emp e : list){
/*
* Element同样支持方法:
* Element addElement(String name)
* 向当前标签中添加给定名字的子标签
*/
//向根标签中添加emp标签
Element emp
= root.addElement("emp");
//向emp标签中添加子标签name
Element name
= emp.addElement("name");
name.addText(e.getName());
//向emp标签中添加子标签age
emp.addElement("age")
.addText(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);
writer.close();
}catch(Exception e){
}
}
}
DOM4J对XPATH的支持
package demoXml;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* DOM4J对XPATH的支持
* @author Administrator
*
*/
public class XMLDemo3 {
public static void main(String[] args){
try{
//读取xml文件转换为Document
SAXReader reader
= new SAXReader();
Document doc
= reader.read(
new File("myemp.xml")
);
String path
= "/list/emp[gender='女']" +
"/salary[.>4000]";
/*
* List selectNodes(String xpath)
* 根据给定的XPATH查询对应的节点
*/
List list
= doc.selectNodes(path);
for(Object o : list){
Element e = (Element)o;
System.out.println(e.getText());
}
}catch(Exception e){
e.printStackTrace();
}
}
}