天天看点

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
           

修改后记得写会到文件中。