在pom 中引入:
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
(一)新增一个xml文件
本地没有xml文件,创建一个新的xml文件:
private static final String ELEMENT_ROOT="account-persist";
private static final String ELEMENT_ACCOUNTS="accounts";
private static final String ELEMENT_ACCOUNT="account";
private static final String ELEMENT_ACCOUNT_ID="id";
private static final String ELEMENT_ACCOUNT_NAME="name";
private static final String ELEMENT_ACCOUNT_EMAIL="email";
private static final String ELEMENT_ACCOUNT_PASSWORD="password";
private static final String ELEMENT_ACCOUNT_ACTIVATED="";
private String file="F:\\learnTest\\mvnbook\\persist-data.xml";
private SAXReader reader=new SAXReader();
private void readDocument(){
File dateFile=new File(file);
if(!dateFile.exists()){
dateFile.getParentFile().mkdirs();
//创建xml文件,元素是嵌套关系
Document doc= DocumentFactory.getInstance().createDocument();
Element rootFirstEle=doc.addElement(ELEMENT_ROOT);
Element secEle=rootFirstEle.addElement(ELEMENT_ACCOUNTS);
Element thEle=secEle.addElement(ELEMENT_ACCOUNT);
Element sub_Ele_1=thEle.addElement(ELEMENT_ACCOUNT_ID);
sub_Ele_1.addAttribute("color","red");
sub_Ele_1.setText("1");
Element sub_Ele_2=thEle.addElement(ELEMENT_ACCOUNT_NAME);
sub_Ele_2.setText("test");
Element sub_Ele_3=thEle.addElement(ELEMENT_ACCOUNT_EMAIL);
sub_Ele_3.setText("[email protected]");
Element sub_Ele_4=thEle.addElement(ELEMENT_ACCOUNT_PASSWORD);
sub_Ele_4.setText("123456");
writeDocument(doc);
}
创建一个文件输出流,将xml写入到指定的文件中:
private void writeDocument(Document doc){
Writer out=null;
try{
out=new OutputStreamWriter(new FileOutputStream(file),"utf-8");
XMLWriter writer=new XMLWriter(out, OutputFormat.createPrettyPrint());
writer.write(doc);
}catch (Exception e){
e.printStackTrace();
}finally {
try{
if(out!=null){
out.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
添加的xml文件的结果形式是:
<?xml version="1.0" encoding="UTF-8"?>
<account-persist>
<accounts>
<account>
<id color="red">1</id>
<name>test</name>
<email>[email protected]</email>
<password>123456</password>
</account>
</accounts>
</account-persist>
(二)读取xml文件里的内容
方法一:
//读取xml内容
//这种方式需要熟悉xml文件的结构
public void readDoc(){
SAXReader reader=new SAXReader();
try{
Document doc=reader.read(new File(file));
//获取根节点account-persist的子元素accounts
Element rootEle=doc.getRootElement().element(ELEMENT_ACCOUNTS);
//再获取子元素accounts下的子元素account
Element accountEle=rootEle.element(ELEMENT_ACCOUNT);
//找出该节点下的所有元素
List<Element> elements=accountEle.elements();
//遍历所有元素
for(Element element:elements){
System.out.println("节点名称:"+element.getName()+" "+"节点的值:"+element.getText());
}
}catch(Exception e){
e.printStackTrace();
}
}
运行的结果:
节点名称:id 节点的值:1
节点名称:name 节点的值:test
节点名称:email 节点的值:[email protected]
节点名称:password 节点的值:
(二)迭代和递归遍历xml内容
//在不知道xml文件结构的情况下,使用迭代和递归可以遍历出所有的元素和值
public void iterElement(){
SAXReader reader=new SAXReader();
try{
Document doc=reader.read(new File(file));
Element ele=doc.getRootElement();
//调用递归方法
allNodes(ele);
}catch(Exception e){
e.printStackTrace();
}
}
public void allNodes(Element ele){
//获取节点的属性
List<Attribute> att=ele.attributes();
//迭代当前节点下的所有子元素
Iterator<Element> iteEle=ele.elementIterator();
if(iteEle.hasNext()){
Element element=iteEle.next();
//找出所有子节点
List<Element> elements=element.elements();
for(Element subEle:elements){
System.out.println("节点名字:"+subEle.getName()+" "+"节点值:"+subEle.getText());
allNodes(element);
}
}
}
运行的结果:
节点名字:account 节点值:
节点名字:id 节点值:
节点名字:name 节点值:test
节点名字:email 节点值:[email protected]
节点名字:password 节点值:
(三)修改元素的值
List<Element> elements=element.elements();
for(Element subEle:elements){
System.out.println("节点名字:"+subEle.getName()+" "+"节点值:"+subEle.getText());
//修改元素的值
if (subEle.getName().equals(ELEMENT_ACCOUNT_NAME)) {
System.out.println("修改前name的值"+subEle.getName()+":"+subEle.getText());
subEle.setText("newName");
System.out.println("修改后nam的值"+subEle.getName()+":"+subEle.getText());
}
allNodes(element);
}
修改后的结果:
修改前name的值name:test
修改后nam的值name:newName
修改后记得写会到文件中。