栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 人工智能 > NLP

XML—XML解析之DOM4J

NLP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

XML—XML解析之DOM4J


首先为什么会有Dom4j呢?

因为DOM太耗内存,而SAX只能对XML进行读取,而不能去添加、删除等。所以出现了Dom4j,它的效率更高,同时也可以进行crud操作。

1.DOM4J介绍

Dom4j是一个简单、灵活地开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。

Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括Sun公司自己的JAXP也用了Dom4j。

使用Dom4j开发,需下载dom4j相应的jar文件,并导入到项目。下载地址dom4j下载

2.DOM4J案例

依然使用我们之前的XML文件:

<班级>    <学生 地址="香港">        <名字>周小星        <年龄>23        <介绍>学习刻苦        <学生 地址="澳门">        <名字>林晓        <年龄>25        <介绍>是一个好学生    

该文档放在com.dom4j.test包中。

使用DOM4J也要获取代表整个文档document对象,不过这个document对象是org.dom4j包中的。

在主方法中获取document对象如下:

// 1.得到一个解析器SAXReader saxReader = new SAXReader();// 2.指定解析哪个XML文件document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));

然后我们就可以根据需求来写相应的方法,在主方法中调用。

【1】指定读取某个元素(读取第一个学生的信息)

public static void read(document document) {    // 得到根元素    Element root = document.getRootElement();    // root.elements("学生"):表示取出root下的所有学生元素    // root.element("学生"):表示取出root下的第一个学生元素    Element student = root.element("学生");    // 取出属性    String address = student.attributevalue("地址");    // 取出各个子节点的值    String name = student.element("名字").getText();    String age = student.element("年龄").getText();    String intro = student.element("介绍").getText();    System.out.println(address);    System.out.println(name);    System.out.println(age);    System.out.println(intro);}

【2】添加元素:添加一个学生信息到XML文档中

public static void add(document document) throws Exception {    // 首先我们来创建一个学生节点对象    Element student = documentHelper.createElement("学生");    Element name = documentHelper.createElement("名字");    name.setText("小强");    Element age = documentHelper.createElement("年龄");    age.setText("22");    Element intro = documentHelper.createElement("介绍");    intro.setText("是一个三好学生");    // 把三个子元素加到student节点下    student.add(name);    student.add(age);    student.add(intro);    // 为学生添加属性    student.addAttribute("地址", "大理");    // 将学生节点添加到根节点下    document.getRootElement().add(student);    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8    output.setEncoding("utf-8");    // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);    xmlWriter.write(document);    xmlWriter.close();}

添加学生到XML文档中,也需要在最后将内存中的document对象写入相应的文件,不然所有的操作只是在内存中进行,并不会输出到文件中,这与DOM类似。
我们依然可以将这段更新的代码单独写成一个方法,如下:

public static void update(document document) throws Exception {    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8    output.setEncoding("utf-8");    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);    xmlWriter.write(document);    xmlWriter.close();}

【3】添加一个元素到指定位置

public static void addByIndex(document document) throws Exception {    // 创建一个元素    Element newStu = documentHelper.createElement("学生");    newStu.setText("王小明");    // 得到所有学生的list    List allStudent = document.getRootElement().elements("学生");    allStudent.add(1, newStu);    update(document);}

这里其实是直接在得到的List中添加,然后更新即可。这里的List就是java.util包中的List


【4】删除一个元素或者删除这个元素的属性
删除一个元素与DOM类似,都是通过相应的父节点删除该节点。比方说我们要删除第一个学生节点:

public static void delete(document document) throws Exception {    // 找到该元素    Element student = document.getRootElement().element("学生");    // 删除元素的某个属性    student.remove(student.attribute("地址"));    // 通过父节点删除节点    student.getParent().remove(student);    update(document);}

【5】更新元素
比如我们要把所有学生的年龄加1,并且将所有学生的地址属性改为美国:

public static void updateAgeAndAddress(document document) throws Exception {Element root = document.getRootElement();    List list = root.elements();    for (Element element : list) {        // 更新属性        element.addAttribute("地址", "美国");        // 更新年龄子节点的值        Element e_age = element.element("年龄");        int age = Integer.parseInt(e_age.getTextTrim());        e_age.setText(String.valueOf(age + 1));    }    update(document);}

首先为什么会有Dom4j呢?

因为DOM太耗内存,而SAX只能对XML进行读取,而不能去添加、删除等。所以出现了Dom4j,它的效率更高,同时也可以进行crud操作。

1.DOM4J介绍

Dom4j是一个简单、灵活地开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。

Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括Sun公司自己的JAXP也用了Dom4j。

使用Dom4j开发,需下载dom4j相应的jar文件,并导入到项目。下载地址dom4j下载

2.DOM4J案例

依然使用我们之前的XML文件:

<班级>    <学生 地址="香港">        <名字>周小星        <年龄>23        <介绍>学习刻苦        <学生 地址="澳门">        <名字>林晓        <年龄>25        <介绍>是一个好学生    

该文档放在com.dom4j.test包中。

使用DOM4J也要获取代表整个文档document对象,不过这个document对象是org.dom4j包中的。

在主方法中获取document对象如下:

// 1.得到一个解析器SAXReader saxReader = new SAXReader();// 2.指定解析哪个XML文件document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));

然后我们就可以根据需求来写相应的方法,在主方法中调用。

【1】指定读取某个元素(读取第一个学生的信息)

public static void read(document document) {    // 得到根元素    Element root = document.getRootElement();    // root.elements("学生"):表示取出root下的所有学生元素    // root.element("学生"):表示取出root下的第一个学生元素    Element student = root.element("学生");    // 取出属性    String address = student.attributevalue("地址");    // 取出各个子节点的值    String name = student.element("名字").getText();    String age = student.element("年龄").getText();    String intro = student.element("介绍").getText();    System.out.println(address);    System.out.println(name);    System.out.println(age);    System.out.println(intro);}

【2】添加元素:添加一个学生信息到XML文档中

public static void add(document document) throws Exception {    // 首先我们来创建一个学生节点对象    Element student = documentHelper.createElement("学生");    Element name = documentHelper.createElement("名字");    name.setText("小强");    Element age = documentHelper.createElement("年龄");    age.setText("22");    Element intro = documentHelper.createElement("介绍");    intro.setText("是一个三好学生");    // 把三个子元素加到student节点下    student.add(name);    student.add(age);    student.add(intro);    // 为学生添加属性    student.addAttribute("地址", "大理");    // 将学生节点添加到根节点下    document.getRootElement().add(student);    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8    output.setEncoding("utf-8");    // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);    xmlWriter.write(document);    xmlWriter.close();}

添加学生到XML文档中,也需要在最后将内存中的document对象写入相应的文件,不然所有的操作只是在内存中进行,并不会输出到文件中,这与DOM类似。
我们依然可以将这段更新的代码单独写成一个方法,如下:

public static void update(document document) throws Exception {    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8    output.setEncoding("utf-8");    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);    xmlWriter.write(document);    xmlWriter.close();}

【3】添加一个元素到指定位置

public static void addByIndex(document document) throws Exception {    // 创建一个元素    Element newStu = documentHelper.createElement("学生");    newStu.setText("王小明");    // 得到所有学生的list    List allStudent = document.getRootElement().elements("学生");    allStudent.add(1, newStu);    update(document);}

这里其实是直接在得到的List中添加,然后更新即可。这里的List就是java.util包中的List


【4】删除一个元素或者删除这个元素的属性
删除一个元素与DOM类似,都是通过相应的父节点删除该节点。比方说我们要删除第一个学生节点:

public static void delete(document document) throws Exception {    // 找到该元素    Element student = document.getRootElement().element("学生");    // 删除元素的某个属性    student.remove(student.attribute("地址"));    // 通过父节点删除节点    student.getParent().remove(student);    update(document);}

【5】更新元素
比如我们要把所有学生的年龄加1,并且将所有学生的地址属性改为美国:

public static void updateAgeAndAddress(document document) throws Exception {Element root = document.getRootElement();    List list = root.elements();    for (Element element : list) {        // 更新属性        element.addAttribute("地址", "美国");        // 更新年龄子节点的值        Element e_age = element.element("年龄");        int age = Integer.parseInt(e_age.getTextTrim());        e_age.setText(String.valueOf(age + 1));    }    update(document);}

以上就是XML—XML解析之DOM4J的内容,更多相关内容请关注PHP中文网(www.kaotop.com)!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/794779.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号