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("test@163.com");
            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>test@163.com</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 节点的值:test@163.com
节点名称:password 节点的值:123456

(二)迭代和递归遍历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 节点值:1
节点名字:name 节点值:test
节点名字:email 节点值:test@163.com
节点名字:password 节点值:123456

(三)修改元素的值

        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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值