在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
修改後記得寫會到檔案中。