搜索
首页后端开发XML/RSS教程XML—XML解析之DOM4J

XML—XML解析之DOM4J

Feb 24, 2017 pm 03:14 PM


首先为什么会有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文件:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>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<Element> 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文件:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>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<Element> 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.php.cn)!


声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
故障排除XML/RSS提要:常见的陷阱和专家解决方案故障排除XML/RSS提要:常见的陷阱和专家解决方案May 01, 2025 am 12:07 AM

XML/RSS订阅源的处理涉及解析和优化,常见问题包括格式错误、编码问题和元素缺失。解决方案包括:1.使用XML验证工具检查格式错误;2.确保编码一致性并使用chardet库检测编码;3.处理元素缺失时使用默认值或跳过该元素;4.使用高效解析器如lxml和缓存解析结果以优化性能;5.注意数据一致性和安全性,防止XML注入攻击。

解码RSS文档:阅读和解释提要解码RSS文档:阅读和解释提要Apr 30, 2025 am 12:02 AM

解析RSS文档的步骤包括:1.读取XML文件,2.使用DOM或SAX解析XML,3.提取标题、链接等信息,4.处理数据。RSS文档是一种基于XML的格式,用于发布更新内容,结构包含、和元素,适用于构建RSS阅读器或数据处理工具。

RSS和XML:Web联合组织的基石RSS和XML:Web联合组织的基石Apr 29, 2025 am 12:22 AM

RSS和XML是网络内容分发和数据交换的核心技术。RSS用于发布频繁更新的内容,XML用于存储和传输数据。通过实际项目中的使用示例和最佳实践,可以提高开发效率和性能。

RSS提要:探索XML的作用和目的RSS提要:探索XML的作用和目的Apr 28, 2025 am 12:06 AM

XML在RSSFeed中的作用是结构化数据、标准化和提供可扩展性。1.XML使得RSSFeed的数据结构化,便于解析和处理。2.XML提供了一种标准化的方式来定义RSSFeed的格式。3.XML的可扩展性使得RSSFeed可以根据需要添加新的标签和属性。

缩放XML/RSS处理:性能优化技术缩放XML/RSS处理:性能优化技术Apr 27, 2025 am 12:28 AM

处理XML和RSS数据时,可以通过以下步骤优化性能:1)使用高效的解析器如lxml提升解析速度;2)采用SAX解析器减少内存使用;3)利用XPath表达式提高数据提取效率;4)实施多进程并行处理提升处理速度。

RSS文档格式:探索RSS 2.0及以后RSS文档格式:探索RSS 2.0及以后Apr 26, 2025 am 12:22 AM

RSS2.0是一种开放标准,允许内容发布者以结构化的方式分发内容。它包含了丰富的元数据,如标题、链接、描述、发布日期等,使得订阅者能够快速浏览和访问内容。RSS2.0的优势在于其简洁和扩展性。例如,它允许自定义元素,这意味着开发者可以根据需求添加额外的信息,如作者、分类等。

理解RSS:XML观点理解RSS:XML观点Apr 25, 2025 am 12:14 AM

RSS是一种基于XML的格式,用于发布经常更新的内容。1.RSSfeed通过XML结构化组织信息,包括标题、链接、描述等。2.创建RSSfeed需按照XML结构编写,添加元数据如语言和发布日期。3.高级用法可包含多媒体文件和分类信息。4.调试时使用XML验证工具,确保必需元素存在且编码正确。5.优化RSSfeed可通过分页、缓存和保持结构简洁来实现。通过理解和应用这些知识,可以有效管理和分发内容。

XML中的RSS:解码标签,属性和结构XML中的RSS:解码标签,属性和结构Apr 24, 2025 am 12:09 AM

RSS是一种基于XML的格式,用于发布和订阅内容。RSS文件的XML结构包括根元素、元素和多个元素,每个代表一个内容条目。通过XML解析器读取和解析RSS文件,用户可以订阅并获取最新内容。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。