天天看點

dom4j操作xml檔案

在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
           

修改後記得寫會到檔案中。