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 huawangxin
*
*/
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");
/*
* read方法的作用:
* 读取给定的xml,并将其解析转换为一个Document对象。
* 实际上这里已经完成了对整个xml解析的工作。并将所有内容封装到了Document对象中
* Document对象可以描述当前xml文档。
*/
Document doc=reader.read(xmlFile);
//3
Element root=doc.getRootElement();
/*
* Element element(String name)
* 获取单签变迁第一个名为给定名字的标签
* List element(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对象,用于保存信息
Emp e=new Emp( );
//解析emp标签
//获取name的值
/*
* 首先,获取名为“name”的子标签
* 其次,获取前后标签中间的文本
*/
Element ename=emp.element("name");
String name=ename.getText();
//获取年龄
// Element eage=emp.element("age");
// String age=eage.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){
}
}
}
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 huawangxin
*/
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, "男", 8000));
list.add(new Emp(3, "marry", 22, "女", 7000));
list.add(new Emp(4, "kate", 30, "女", 10000));
list.add(new Emp(5, "tom", 23, "男", 12000));
/*
* 生成一个xml的基本步骤
* 1:创建文档对象Document
* 2:为Document添加根节点
* 3:为根节点组件树状结构
* 4:创建xmlWiter
* 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 addElemnet(String name)
* 向前标签中添加给定名字的子标签
*/
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()+"");
}
/*
* 当退出循环后,n那么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) {
// TODO: handle exception
}
}
}
import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /* * DOM4J对XPATHs的支持 */ 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(o); } }catch (Exception e) { e.printStackTrace(); } } }
上述如果有不对或者补充的地方,请大家批评和指教,谢谢。