Java 基础入门 | 第十七章 Java操作XML文件

简介: 目录前言dom4jdom4j概述dom4j的封装和优势面向接口编程支持多种解析机制下载和安装dom4jdom4j常用APIXML文档基本操作XML文档基本操作-DocumentXML文档基本操作-ElementXML文档基本操作-AttributeXML文档基本


前言

JAXP虽然在DOM和SAX解析机制上进行了一定的抽象,但是对XML解析非常繁琐,编程代码冗长,可读性不高。因此在JAVA领域出现了两个开源的XML解析器:dom4j和JDOM。dom4j的开发者说:使用dom4j来解析XML文档,无须参考任何图书,只要有基本的DOM概念,那么

对着dom4j的API文档即可使用dom4j解析。

dom4j

dom4j概述

dom4j是一套开源的XML解析工具,完全支持DOM、SAX和JAXP机制。与它们相比, dom4j

更为简单易用,因此实际项目中往往选择dom4j作为XML解析器。dom4j没有提供其他语言版本,只提供JAVA语言版本。

dom4j的封装和优势

dom4j在很大程序上简化了XML的处理方式。从表面上看, dom4j有点类似于DOM解析机制,也

将XML文档转换为一棵结构化树(dom4j树),但dom4j树的处理方式比DOM树更为简单。

   由于dom4j如此优秀,很多优秀的开源项目都采用dom4j作为XML解析器,在实际的开发过程中,它通常是首选。

面向接口编程

   它的实质是以其他XML解析器为基础, dom4j采用面向接口编程的方式来处理XML文档解析,这就允许dom4j的底层可以在不同的解析机制之间自由切换。

支持多种解析机制

    • DOMReader:它负责根据W3C的DOM树创建dom4j树
    • SAXReader:它基于SAX解析机制来分析一份XML文档,并将其转换为dom4j树
    • XPP3Reader:其底层需要依赖于XML Pulll Parser 3.x来解析XML文档,并将其转换为dom4j树
    • XPPReader:其底层需要依赖于XML Pulll Parser 2.x来解析XML文档,并将其转换为dom4j树    

    下载和安装dom4j

    登录dom4j的官方站点下载最新版本dom4j1.6.1

    下载完成后得到dom4j1.6.1.zip,将其解压缩可得到如下目录结构

    docs:该目录下存放了dom4j的说明文件和API文档

    lib:该目录下存放了dom4j编译和运行所依赖的第三方类库

    Src:该目录下存放了dom4j项目的所有源文件

    xdocs:该目录存放dom4j的一些相关文档,是XML格式

    xml:该目录下存放了dom4j提供了一些简单的范例xml文档

    dom4j-1.6.1.jar:dom4j的核心JAR包

    将dom4j-1.6.1.jar添加到系统CLASSPATH环境变量中    

     

    dom4j常用API

    image.gif编辑

    image.gif编辑

    XML文档基本操作

    XML文档基本操作-Document

    获取XML文档对象Document

    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.io.SAXReader;
    import java.io.File;
    import java.net.MalformedURLException;
    public class XMLTest {
        public static void main(String[] args) throws MalformedURLException, DocumentException {
            File xmlFile = new File("pom.xml");
            SAXReader reader = new SAXReader();
            Document xmlDoc = reader.read(xmlFile);
        }
    }

    image.gif

    XML文档基本操作-Element

    获取根元素对象  

    Element root = xmlDoc.getRootElement();

    image.gif

    获取根元素名称

    String elementName = root.getName();

    image.gif

    通过元素名称获取元素对象集合

    Element element = root.element(“元素名称");

    image.gif

    获取所有直接子元素对象集合

    List elementList = root.elements();

    image.gif

    获取element元素的内部文本

    String text = element.getText();

    image.gif

    获取element子元素内部文本

     

    String text = element.elementText(“子元素名称”);

    image.gif

    遍历XML树DOM4J提供至少3种遍历节点的方法:

    枚举(Iterator)

    // 枚举所有子节点
        for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
            Element element = (Element) i.next();
            // do something
        }
        // 枚举名称为foo的节点
        for ( Iterator i = root.elementIterator(foo); i.hasNext();) {
            Element foo = (Element) i.next();
            // do something
        }
        // 枚举属性
        for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
            Attribute attribute = (Attribute) i.next();
            // do something
        }

    image.gif

    递归

    public void treeWalk(Element element) {
      for (int i = 0, size = element.nodeCount(); i < size; i++){
          Node node = element.node(i);
          //如果得到的节点是一个元素就继续寻找子节点
          if (node instanceof Element) {
            treeWalk((Element) node);
          } else {
            // do something....
          }
         }
    }

    image.gif

    Visitor模式

    public class MyVisitor extends VisitorSupport {
        public void visit(Element element){
            System.out.println(element.getName());
        }
        public void visit(Attribute attr){
            System.out.println(attr.getName());
        }
    }

    image.gif

    调用 :root.accept(new MyVisitor()) 就可以了,Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器 。注意:这个Visitor是自动遍历所有节点的。如果是root.accept(MyVisitor),将遍历子节点

    XML文档基本操作-Attribute

    获取元素属性对象
    通过属性名获取元素属性对象

    Attribute   attribute = element.attribute(“属性名称");

    image.gif

    通过索引获取属性对象

    Attribute  attribute = element.attribute(0);

    image.gif

    获取所有属性对象集合

    List  attributeList = root.attributes();

    image.gif

    获取属性值
    通过属性对象

    String value = attribute.getValue();

    image.gif

    通过元素对象

    String  value = element.attributeValue(“属性名称”);

    image.gif

    XML文档基本操作-创建

    创建文档Document

    Document document = DocumentHelper. createDocument();

    image.gif

    创建元素

    Element element = document.addElement(“元素名称");

    image.gif

    创建属性

    element. addAttribute(“属性名”,“属性值");

    image.gif

    添加属性方法返回的是原元素对象。如同StringBuffer。
    创建文本

    element.addText(“文本");

    image.gif

    XML文档基本操作-删除节点

      • remove(Element element)
      • remove(Attribute attribute)
      • remove(Text text)
      • remove(Node node)

      Node接口的子类对象都可以移除

      注意:remove是移除直接子节点时使用

      parentElement.remove(childElement);

      image.gif

      XML文档基本操作-建立xml文件

      建立xml文件

      FileWriter fw = new FileWriter(“students2.xml”);
      XMLWriter writer = new XMLWriter(fw);
      writer.write(document);
      writer.close();

      image.gif

      建立漂亮的xml文档,可以指定字符编码

      OutputFormat format = OutputFormat.createPrettyPrint();
      format.setEncoding(“GBK");
      XMLWriter writer = new XMLWriter(fw,format);

      image.gif

      XML文档基本操作-查询节点

      获取所有符合条件的节点
      selectNodes(String xpathExpression) 返回List集合

      List nodes= root.selectNodes("//dependency");

      image.gif

      获取符合条件的单个节点
      selectSingleNode(String xpathExpression) 返回一个Node对象。    
      如果符合条件的节点有多个,那么返回第一个。

      Node node= root.selectSingleNode("//dependency");

      image.gif

      注意:使用dom4j-1.6.1.jar时,需要另一个包jaxen-1.1-beta-6.jar提供支持

      XPath支持

      XPath简介

      XPath是一个获取XML文档中你所需要的节点元素的组件。它允许你用很少的代码就能获取指定的路径下你所选取的节点的值。

      DOM4J对XPath有良好的支持,如访问一个节点,可直接用XPath选择

      public void bar(Document document) {
                  List list = document.selectNodes( //foo/bar );
                  Node node = document.selectSingleNode(//foo/bar/author);
                  String name = node.valueOf( @name );
          }

      image.gif

      选择属性

        • 注释:用“/”路径开始代表元素的绝对路径.
        • 用“//”路径开始代表整个文档满足条件的所有元素
        • 在XPath中,所有属性使用@前缀
        • 下面的XPath表达式,选取所有名为catalog的属性
        • //@catalog
        • 下面的XPath表达式,选取所有具有catalog属性的item元素
        • //item[@catalog]
        • 下面的XPath表达式,选取所有具有任何属性的item元素
        • //item[@*]
        • 下面的XPath表达式,选取所有具有catalog等于"parts"属性的item元素
        • //item[@catalog="parts"]

        XPath语法

        image.gif编辑


        相关文章
        |
        8月前
        |
        Java 开发者
        重学Java基础篇—Java类加载顺序深度解析
        本文全面解析Java类的生命周期与加载顺序,涵盖从加载到卸载的七个阶段,并深入探讨初始化阶段的执行规则。通过单类、继承体系的实例分析,明确静态与实例初始化的顺序。同时,列举六种触发初始化的场景及特殊场景处理(如接口初始化)。提供类加载完整流程图与记忆口诀,助于理解复杂初始化逻辑。此外,针对空指针异常等问题提出排查方案,并给出最佳实践建议,帮助开发者优化程序设计、定位BUG及理解框架机制。最后扩展讲解类加载器层次与双亲委派机制,为深入研究奠定基础。
        295 0
        |
        4月前
        |
        存储 Java 程序员
        Java 基础知识点全面梳理包含核心要点及难点解析 Java 基础知识点
        本文档系统梳理了Java基础知识点,涵盖核心特性、语法基础、面向对象编程、数组字符串、集合框架、异常处理及应用实例,帮助初学者全面掌握Java入门知识,提升编程实践能力。附示例代码下载链接。
        183 1
        |
        6月前
        |
        IDE Java 开发工具
        【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤
        IntelliJ IDEA创建Java项目的图文详细步骤,手把手带你创建Java项目
        1051 10
        【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤
        |
        5月前
        |
        存储 安全 Java
        2025 年最新 40 个 Java 基础核心知识点全面梳理一文掌握 Java 基础关键概念
        本文系统梳理了Java编程的40个核心知识点,涵盖基础语法、面向对象、集合框架、异常处理、多线程、IO流、反射机制等关键领域。重点包括:JVM运行原理、基本数据类型、封装/继承/多态三大特性、集合类对比(ArrayList vs LinkedList、HashMap vs TreeMap)、异常分类及处理方式、线程创建与同步机制、IO流体系结构以及反射的应用场景。这些基础知识是Java开发的根基,掌握后能为后续框架学习和项目开发奠定坚实基础。文中还提供了代码资源获取方式,方便读者进一步实践学习。
        1454 2
        |
        5月前
        |
        存储 安全 Java
        Java 基础知识面试题汇总 最全面的 Java 基础面试题整理
        本文全面解析Java基础知识面试题,涵盖Java基础概念、面向对象编程、异常处理、集合框架等核心内容。通过实际应用场景,提供技术方案与应用实例,如JDK与JRE区别、==与equals()差异、String类特性、final与static关键字用法、多继承替代方案及接口与抽象类对比。帮助开发者夯实基础,高效备考,提升实战能力。附带完整代码示例,可供下载学习。
        719 3
        |
        Java Linux
        java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
        本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
        559 2
        |
        8月前
        |
        设计模式 缓存 Java
        重学Java基础篇—Java对象创建的7种核心方式详解
        本文全面解析了Java中对象的创建方式,涵盖基础到高级技术。包括`new关键字`直接实例化、反射机制动态创建、克隆与反序列化复用对象,以及工厂方法和建造者模式等设计模式的应用。同时探讨了Spring IOC容器等框架级创建方式,并对比各类方法的适用场景与优缺点。此外,还深入分析了动态代理、Unsafe类等扩展知识及注意事项。最后总结最佳实践,建议根据业务需求选择合适方式,在灵活性与性能间取得平衡。
        513 3
        |
        8月前
        |
        安全 IDE Java
        重学Java基础篇—Java泛型深度使用指南
        本内容系统介绍了Java泛型的核心价值、用法及高级技巧。首先阐述了泛型在**类型安全**与**代码复用**中的平衡作用,解决强制类型转换错误等问题。接着详细讲解了泛型类定义、方法实现、类型参数约束(如边界限定和多重边界)、通配符应用(PECS原则)以及类型擦除的应对策略。此外,还展示了泛型在通用DAO接口、事件总线等实际场景的应用,并总结了命名规范、边界控制等最佳实践。最后探讨了扩展知识,如通过反射获取泛型参数类型。合理运用泛型可大幅提升代码健壮性和可维护性,建议结合IDE工具和单元测试优化使用。
        281 1
        |
        8月前
        |
        安全 IDE Java
        重学Java基础篇—Java Object类常用方法深度解析
        Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
        240 1
        |
        10月前
        |
        存储 移动开发 算法
        【潜意识Java】Java基础教程:从零开始的学习之旅
        本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
        239 1

        热门文章

        最新文章