开发者社区> huihuizi> 正文

jar包神作之 dom4j (让xml解析变得如此简单)

简介: xml的增删改查(dom4j.jar) 应该不用多久就可以使用通过jdk自带的jar包实现解析,–》dom解析,现在基础比较薄弱
+关注继续查看

xml的增删改查(dom4j.jar)

应该不用多久就可以使用通过jdk自带的jar包实现解析,–》dom解析,现在基础比较薄弱

首先通过用来xml的操作的demo4j.jar包( 配合一些其他的包 ),学会了如何使用第三方的jar包,


我在查看源码过程中,遇到反编译问题、然后给eclipse安装了反编译工具jad和JADClipse


//小伙伴如果有相同的需求,可以去我的博客里找一下反编译安装的博客,搜索配置eclipse即可


1.xml的解析

public static void main(String[] args) throws DocumentException {
        // TODO Auto-generated method stub
        
        //将xml加入到内存中形成file对象
        File file = new File("e:/person.xml");
        
        //初始化domj4的核心类
        SAXReader  reader = new SAXReader();
        
        //调用read方法去读取xml文件
        Document document = reader.read(file);
        
        //展示在控制台上
//      System.out.println(doucment.asXML());
        
        //获取文档根元素
        Element rootElement =document.getRootElement();
        
        将根目录的属性转为链表
        List<Attribute> attributes = rootElement.attributes();
        
        //属性数量
        System.out.println(rootElement.attributeCount());
        //是否有内容
        System.out.println(document.hasContent());
        //将属性链表循环打印
        for (Attribute attribute : attributes) {
            System.out.println(attribute.getName()+" "+attribute.getValue());
        }
        //输出xml
        System.out.println(document.asXML());
    }

2.xml的写入

public static void main(String[] args) throws IOException, DocumentException {

        //创建一个文档对象
        Document document = DocumentHelper.createDocument();
        
        //创建根元素
        Element rootElement = document.addElement("person");
        
        //给根元素添加属性
        rootElement.addAttribute("sex", "男");
        
        //通过根元素创建子元素
        Element brainElement = rootElement.addElement("brain");
        
        //给brain添加属性
        brainElement.addAttribute("size", "36");
        
        //给brain添加文本值
        brainElement.setText("脑袋");
        
        //.通过根元素创建子元素
        Element lefteyes = brainElement.addElement("eyes");
        //给lefteyes添加属性
        lefteyes.addAttribute("num", "0.3");
        //给lefteyes添加文本值
        lefteyes.setText("左眼");
        
        //.通过眼元素创建子元素
        Element righteyes = brainElement.addElement("eyes");
        //给righteyes添加属性
        righteyes.addAttribute("num", "0.5");
        //给lefteyes添加文本值
        righteyes.setText("右眼");
        
        //设定格式化输出标准
        OutputFormat format = new OutputFormat().createPrettyPrint(); //漂亮的输出  (有回车的输出)
//      OutputFormat format = new OutputFormat().createCompactFormat(); //紧凑的输出
        
        format.setEncoding("utf-8");//设定输出的内容的编码的格式
        
        //最后写入    写入其实是一个io操作
        //s设定文件存放的路径
        String path = "E://person.xml";
        FileWriter fileWriter = new FileWriter(path);//开启一个写入对象,意思为与path构建一个流链接
        
        //将文件对象存放到xml
        XMLWriter xmlWriter = new XMLWriter(fileWriter,format);//第二个参数是使用相对应的 输出格式样式
        
        //将文档输入到xml对象中
        xmlWriter.write(document);
        
        //关闭相对应的流对象
        xmlWriter.close();
        fileWriter.close();
        
        System.out.println("写入成功了");
        //测试
        
        //使用demoj4核心类取读取xml文件,然后再次输出刚刚写的xml文件
        File file = new File("E://person.xml");//xml对象
        SAXReader r = new SAXReader();//核心类
        Document d = r.read(file);
        System.out.println(d.asXML());
        
        
    }

3.xml删除节点元素

public static void main(String[] args) throws DocumentException, IOException {
        String filepath = "e://person.xml";//获取xml对象
        File file = new File(filepath);//存入文件对象
        SAXReader r = new SAXReader();//实例xml核心类
        Document document = r.read(file);
        
        //然后获取根节点
        Element e = document.getRootElement();
        
        //通过根元素直接获取迭代对象
        Iterator<Element> it = e.elementIterator();
        
        //遍历二级节点,抽取属性,进行查找,然后进行删除
        while (it.hasNext()) {
            //获取子节点
            Element evey = it.next();
            System.out.println(evey.attributeValue("sid"));
            //如果这个节点的sid属性不为空
            if(evey.attributeValue("sid")!=null) {
                //如果sid的值为102
                if (evey.attributeValue("sid").equals("102")) 
                {
                    it.remove();//删除节点
                }
            } 
        }
        //删除完的写入对象
        OutputFormat o = OutputFormat.createPrettyPrint();
        o.setEncoding("utf-8");//文件的编码格式
        XMLWriter xmlWriter =new XMLWriter(new FileWriter(filepath),o);
        xmlWriter.write(document);
        xmlWriter.close();
    }

4.xml更改节点元素

public static void main(String[] args) throws DocumentException, IOException {
        String filepath = "e://person.xml";//创建路径
        File file = new File(filepath);//写入文件对象
        SAXReader reader = new SAXReader(); //创建demj4的核心类
        Document document = reader.read(file);//读取xml对象 存储为document
        Element root = document.getRootElement();//获取xml文件的根元素
        List<Element> list = root.elements();//将root的子节点转为列表
        //将root的子节点遍历
        for (Element element : list) {
            //将每个结点的属性转为迭代器
            Iterator<Attribute> it = element.attributeIterator();
            //遍历节点的属性
            while (it.hasNext()) {
                //提出每个属性
                Attribute a = it.next();
                //打印属性名和值
                System.out.println(a.getName()+"   "+a.getValue());
                if(a.getValue().equals("102")) 
                {
                    element.selectSingleNode("姓名").setText("王五");
                }
            }
            //又将二级节点下的节点查询了一遍,后续在实战中可以使用递归进行全部遍历
            List<Element> list2 = element.elements();
            for (Element element2 : list2) {
                Iterator<Attribute> it2 = element2.attributeIterator();
                while (it2.hasNext()) {
                    //提出每个属性
                    Attribute a = it2.next();
                    //打印属性名和值
                    System.out.println(a.getName()+"   "+a.getValue());
                    if(a.getValue().equals("102")) 
                    {
                        element2.selectSingleNode("姓名").setText("王五");
                    }
                }
            }
            
        }
        //将document 更改后的对象存入xml
        OutputFormat o = new OutputFormat().createPrettyPrint();
        o.setEncoding("utf-8");
        XMLWriter xmlWriter = new XMLWriter(new FileWriter(filepath),o);
        xmlWriter.write(document);
        xmlWriter.close();
    }

5.查询元素,属性、属性值、节点

public static void main(String[] args) throws DocumentException {
        // TODO Auto-generated method stub
        String path = "e://person.xml";
        //文件对象
        File file = new File(path);
        //核心类
        SAXReader saxReader = new SAXReader();
        //读取xml
        Document document = saxReader.read(file);
        //获取根目录
         Element rootElement = document.getRootElement();
        //查询根目录子节点
         List<Element> secondElement = rootElement.elements();
         //遍历子节点
         for (Element element : secondElement) {
             //节点属性转列表
             List<Attribute> a = element.attributes();
             //获取第一个属性
             Attribute attr = a.get(0);
             //打印节点名字,节点属性,属性值
            System.out.println(element.getName()+" ,"+attr.getName()+" : "+attr.getValue());
        }
}

6.练习使用添加

/**
 * @Description:xml作业 
 * 1.将以下信息写入一个名字为User的xml文件中
             001     23岁              男                           张三                                1383838438
             002     24岁             女                            李美丽                            1393939439
             003     25岁              男                           王五                               1585858598  
 * @auther:Li Ya Hui
 * @Time:2021年4月16日上午9:58:02
 */
public class homework {
    public static void main(String[] args) throws DocumentException, IOException {
        // TODO Auto-generated method stub
        File file =new File("e://person.xml");
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(file);
        Element root = document.getRootElement();
        root.setName("User");
        //遍历出根节点下所有节点
        List<Element> a = root.elements();
        //遍历删除
        for (Element element : a) { //我首先把文件中的所有节点删除,,又练习了一边删除
            //根目录的remmove方法每个节点
            root.remove(element);
        }
        System.out.println(root.asXML());//输出xml信息
        
        Element stu1 = root.addElement("学号");//根节点添加一个二级节点,
        stu1.addAttribute("学号","001" );//属性为学号  001
        stu1.addElement("年龄").setText("23岁");//001添加年龄节点
        stu1.addElement("性别").setText("男");  //001添加性别节点
        stu1.addElement("名字").setText("张三"); //001添加名字节点
        stu1.addElement("电话").setText("1383838438");//001添加电话节点
        
        Element stu2 = root.addElement("学号");//根节点添加一个二级节点,
        stu2.addAttribute("学号","002" );//属性为学号  001
        stu2.addElement("年龄").setText("24岁");//001添加年龄节点
        stu2.addElement("性别").setText("女");  //001添加性别节点
        stu2.addElement("名字").setText("李美丽 "); //001添加名字节点
        stu2.addElement("电话").setText("1393939439");//001添加电话节点
        
        Element stu3 = root.addElement("学号");//根节点添加一个二级节点,
        stu3.addAttribute("学号","003" );//属性为学号  001
        stu3.addElement("年龄").setText("25岁");//001添加年龄节点
        stu3.addElement("性别").setText("男");  //001添加性别节点
        stu3.addElement("名字").setText("王五"); //001添加名字节点
        stu3.addElement("电话").setText("1585858598");//001添加电话节点
        
        OutputFormat o = new OutputFormat().createPrettyPrint();//漂亮的换行输出
        o.setEncoding("utf-8"); //设置编码格式
        XMLWriter s = new XMLWriter(new FileWriter(file),o);//创建写入流
        s.write(document);  //写入文件
        s.close();//关闭流
        //重新加载了一遍xml新的文件
        document = saxReader.read(file);
        System.out.println(document.asXML());
    }
}

7.练习递归查找、添加、删除、更改

/**
 * @Description:作业2从person.xml文件中将所有人的姓名展示出来
 *              //3.张三的名字改为007
 *              //4.向person.xml中添加一条数据信息,004  26岁     男       李四     1343434394
 *              //5.将person.xml文件中的性别为女的那一条数据删除      
 * @auther:Li Ya Hui
 * @Time:2021年4月16日上午10:49:36
 */
public class homework2 {
    //递归展示  姓名
    public static void main(String[] args) throws Exception {
        //创建文件对象
        File file = new File("e://person.xml");
        //创建核心类
        SAXReader saxReader = new SAXReader() ;
        //读取xml文件
        Document docu = saxReader.read(file);
        //根节点的子节点转为链表
        Element root = docu.getRootElement();
        //递归查找
        diGui(root);
        
        //创建写入格式和开辟写入流
        OutputFormat o = new OutputFormat().createPrettyPrint();
        o.setEncoding("utf-8");
        XMLWriter x = new XMLWriter(new FileWriter(file),o);
        
        // 4小题  添加数据 004    26岁                  男                         李四                                  1343434394
        Element e =root.addElement("学号").addAttribute("学号", "003");
        e.addElement("年龄").setText("26岁");
        e.addElement("性别").setText("男");
        e.addElement("姓名").setText("李四");
        e.addElement("电话").setText("1343434394");

        //  写入文件
        x.write(docu);
        //  关闭流
        x.close();
    }
    //递归实现查找所有姓名   //实现查找张三  //实现删除性别女的整条数据
    private static void diGui(Element docu) {
        @SuppressWarnings("unchecked")
        List<Element> root = docu.elements(); 
        
        //获取元素的长度,长度为零代表没有节点
        if (root.size()==0) 
        {
            System.out.println(docu.getName()+":此节点结束");
        }else {
            //遍历根目录的子节点
            for (Element element : root) {
                // 5 小题  删除数据  条件性别:女
                if (element.selectSingleNode("性别")!=null) 
                {       //查找性别女
                    if (element.selectSingleNode("性别").getText().equals("女")) {
                        docu.remove(element);
                    }
                }
                //3 小题  更改名字张三
                if (element.selectSingleNode("名字")!=null) 
                {       //查找张三
                    if (element.selectSingleNode("名字").getText().equals("张三")) {
                        element.selectSingleNode("名字").setText("007");
                    }
                }
                if(element.getName().equals("名字"))
                {
                    System.out.println(element.getText());
                }
                diGui(element);
            }
        }
    }
}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android网络与数据存储——网络编程数据处理(网络请求解析Json,解析xml)
Android网络与数据存储——网络编程数据处理(网络请求解析Json,解析xml)
50 0
hutool解析XML字符串
hutool解析XML字符串
216 0
python【模块】xml.etree.ElementTree 解析 xml(2)
python【模块】xml.etree.ElementTree 解析 xml(2)
45 0
python【模块】xml.etree.ElementTree 解析 xml(1)
python【模块】xml.etree.ElementTree 解析 xml(1)
81 0
PHP中simplexml_load_string解析xml的正确方式
对接我php接口的是安卓客户端,json字符串中在一个元素的时候是对象类型,多个元素的时候是数组类型,安卓客户端解析就失败了。 所以引申出这篇文章,详细测试、记录一下php中解析xml方式和细节
41 0
PHP解析json、xml错误
php内置函数json_decode() 可以解析json字符串 但是有的时候看起来正确的json,解析却一直返回null。 你知道吗,json是可能解析失败的,此时PHP不会产生提示。 我们需要手动通过json_last_error()函数获取
28 0
Java中使用DOM4J来生成xml文件和解析xml文件
Java中使用DOM4J来生成xml文件和解析xml文件
105 0
第十一讲:Android中的xml和Json文件的解析
第十一讲:Android中的xml和Json文件的解析
42856 0
利用dom4j解析xml
利用dom4j解析xml
36 0
sprintboot文件上传XML文件并解析
sprintboot文件上传XML文件并解析
43 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载