Java XML 重新整理过的

本文介绍使用DOM4J库进行XML文件的读写操作,包括解析XML文档、获取节点内容、属性操作、节点的增删改查等功能,并演示如何将修改后的XML文档保存回文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.company;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class Main {

    public static void main(String[] args) throws DocumentException, IOException {
        //导入jar包
        //File - ProjectStructure -> 左侧Modules
        //-> +号, JARS or  ...  ->找到jar包并添加
//        demo1();
//        demo2();
//        demo3();
//        demo4();
//        demo5();
//        demo6();
        demo7();
    }

    //解析
    //常用的获取内容的方法
    public static void demo1() throws DocumentException {
        SAXReader sax = new SAXReader();
        File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
        //读取文件内容,将内容以Document的形式呈现
        Document document = sax.read(file);
        //1. 获取根节点(students)
        Element root = document.getRootElement();
        //获取根节点名称 - (students)
        System.out.println("根节点名称: " + root.getName());
        //2. 获取节点内容 - (无)
        System.out.println("根节点内容:  " + root.getTextTrim());
        //3. 获取子节点
        List<Element> elements = root.elements();
        System.out.println("子节点名称: " + elements.get(1).getName());
        // 打印子节点的名字
        System.out.println("子节点内容: " + elements.get(1).getTextTrim());
        //"孙子节点" 获取student1的子节点
        List<Element> subEs = elements.get(0).elements();
        //打印student1的子节点的名字name
        System.out.println("孙子节点的名称: " + subEs.get(0).getName());
        //打印student的子节点的内容(本平)
        System.out.println("孙子节点的内容: " + subEs.get(0).getTextTrim());

        //练习: 使用for循环/for-each循环,
        // 打印xml文件中所有标签的名字及内容
        //提示:循环嵌套
    }

    public static void demo2() throws DocumentException {

        //方式一 for循环
        SAXReader sax = new SAXReader();
        File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
        //读取文件内容,将内容以Document的形式呈现
        Document document = sax.read(file);
        //1. 获取根节点(students)
        Element root = document.getRootElement();
        getNodes(root);
//        List<Element> elements = root.elements();
//        for (int i = 0; i < elements.size(); i++) {
//            elements.get(i).getName();
//            elements.get(i).getTextTrim();
//            List<Element> subes = elements.get(i).elements();
//            for (int j = 0; j < subes.size(); j++) {
//                subes.get(j).getName();
//                subes.get(j).getTextTrim();
//                System.out.println("根节点名称: " + root.getName() + "子节点名称: "
//                        + elements.get(i).getName()
//                        + "孙子节点的名称: " + subes.get(j).getName() + "孙子节点的内容: " + subes.get(j).getTextTrim());
//            }
//        }

//        //方式二 for-each循环
//        System.out.println("根节点名称: " + root.getName());
//        //2. 获取节点内容 - (无)
//        System.out.println("根节点内容:  " + root.getTextTrim());
//        for (Element e : elements) {
//            System.out.println("子节点名称: " + e.getName());
//            //2. 获取节点内容 - (无)
//            System.out.println("子节点内容:  " + e.getTextTrim());
//            List<Element> subEs = e.elements();
//            for (Element e1 : subEs) {
//                System.out.println("孙子节点名称: " + e1.getName());
//                // 打印子节点的名字
//                System.out.println("孙子节点内容: " + e1.getTextTrim());
//            }
//        }
    }

    //通用的遍历方式 - 递归
    //参数为任意需要遍历的节点
    public static void getNodes(Element node) throws DocumentException {
        System.out.println("当前节点名称: " + node.getName());
        System.out.println("当前节点内容:  " + node.getTextTrim());
        List<Attribute> attr = node.attributes();
        for (Attribute a : attr) {
            System.out.println("属性名称: " + a.getName());
            System.out.println("属性值: " + a.getValue());
        }
        //获取子节点
        List<Element> elements = node.elements();
        //遍历所有子节点
        for (Element e : elements) {
            //递归, 调用自己
            getNodes(e);
        }
    }

    //属性
    public static void demo3() throws DocumentException {
        SAXReader sax = new SAXReader();
        File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
        //读取文件内容,将内容以Document的形式呈现
        Document document = sax.read(file);
        //1. 获取根节点(students)
        Element root = document.getRootElement();

        List<Element> elements = root.elements();
        //获取student1节点
        Element stu1 = elements.get(0);

        //通过名字直接获取
        //注意: 只能获取一级标签
        Element e = stu1.element("name");
        System.out.println(e.getName());
        System.out.println(e.getTextTrim());

        //通过名字直接获取值
        String str = stu1.elementText("name");
        System.out.println(str);

        //通过名字直接获取属性
        Attribute att = stu1.attribute("id");
        System.out.println(att.getName());
        System.out.println(att.getValue());

        //通过名字直接获取属性值
        String str1 = stu1.attributeValue("id");
        System.out.println(str1);

        //当前节点的所有属性
        List<Attribute> attr = stu1.attributes();
        //属性名(id)
        System.out.println("属性名: " + attr.get(0).getName());
        //属性值(001)
        System.out.println("属性值: " + attr.get(0).getValue());


        //for循环遍历
        for (int i = 0; i < elements.size(); i++) {
            List<Attribute> attre = elements.get(i).attributes();
            for (int j = 0; j < attre.size(); j++) {
                attre.get(j).getName();
                attre.get(j).getValue();
                System.out.println("属性名字: " + attre.get(j).getName() + "属性值: " + attre.get(j).getValue());
            }
        }

        //for-each遍历
        for (Attribute a : attr) {
            System.out.println("属性名字: " + a.getName() + "属性值: " + a.getValue());

        }


    }

    //属性的增删改查
    public static void demo4() throws DocumentException {

        SAXReader sax = new SAXReader();
        File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
        //读取文件内容,将内容以Document的形式呈现
        Document document = sax.read(file);
        //1. 获取根节点(students)
        Element root = document.getRootElement();
        //先获取有属性的节点student1
        Element stu1E = root.element("student1");
        //获取属性
        Attribute idA = stu1E.attribute("id");
        //删除属性
        stu1E.remove(idA);
        //添加/修改属性
        //如参数1存在,即修改
        //不存在,就添加
        stu1E.addAttribute("id", "新id 值");
        //输出改变后的student1
        getNodes(stu1E);

    }

    //节点的增删改查
    public static void demo5() throws DocumentException, IOException {
        SAXReader sax = new SAXReader();
        File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
        //读取文件内容,将内容以Document的形式呈现
        Document document = sax.read(file);
        //1. 获取根节点(students)
        Element root = document.getRootElement();
        //先获取有属性的节点student1
        Element stu1E = root.element("student1");
        //添加新的节点phone
        Element phoneE = stu1E.addElement("phone");
        //为节点设置值
        phoneE.setText("133XXXXXXXX");
        stu1E.remove(phoneE);
        //删除节点
        Element nameE = stu1E.element("name");
//        stu1E.remove(nameE);
        //修改
        nameE.setText("张然2");
        getNodes(stu1E);

        writeToFile(document);
    }

    //将改动写入到文件中
    public static void writeToFile(Document document) throws DocumentException, IOException {
        //中文字符
        //输出格式
//        OutputFormat format = OutputFormat.createCompactFormat();
//        //设置编码
//        format.setEncoding("GBK");
//        File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
//        FileWriter fileWriter = new FileWriter(file);
//        XMLWriter xmlWriter = new XMLWriter(fileWriter, format);
//        xmlWriter.write(document);
//        xmlWriter.close();

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/company/student.xml"), format);
        xmlWriter.write(document);
        xmlWriter.close();
    }

    //将字符串转化成XML
    public static void demo6() throws DocumentException, IOException {
        String text = "<members><member>aaa</member></members>";
        Document document = DocumentHelper.parseText(text);
        writeToFile(document);
    }

//    将XML转化为字符串
    public static void demo7() throws DocumentException, IOException {
        SAXReader sax = new SAXReader();
        File file = new File("/Users/dllo/Documents/Class11_XML/src/com/company/student.xml");
        //读取文件内容,将内容以Document的形式呈现
        Document document = sax.read(file);
        Element root = document.getRootElement();
        //将document整体转为字符串
        String docStr = document.asXML();
        System.out.println(docStr);
        System.out.println("___________________________");

        //将root根节点整体转为字符串
        String rootStr = root.asXML();
        System.out.println(rootStr);
        System.out.println("___________________________");
        //将一个节点转为字符串
        String stu1 = root.element("student1").asXML();
        System.out.println(stu1);

    }


}

这个是我XML里面自定义的内容

<?xml version="1.0" encoding="UTF-8"?>

<students>
    <student1 id="001" color="red">
        <name>张然2</name>
        <sex></sex>
        <year>23</year>
        <phone>133XXXXXXXX</phone>
    </student1>
    <student2 id="002">
        <name>云赫</name>
        <year>24</year>
        <sex></sex>
    </student2>
</students>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值