XML 处理:在 Java 中解析和生成 XML!

linbojue
• 阅读 31

(全文目录:)

开篇语 哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言   XML(可扩展标记语言)是用于存储和传输数据的标准格式。在许多应用中,XML 常用于配置文件、数据交换和存储结构化信息。在 Java 中,我们可以使用不同的技术来解析和生成 XML 文件。常见的 XML 处理方法包括 DOM 解析、SAX 解析、JDOM 和 DOM4J 等。在这篇文章中,我们将介绍这些解析方式,并探讨如何将 XML 与 Java 对象进行相互转换。

40.1 XML 基础语法   在深入了解 XML 解析之前,我们先回顾一下 XML 的基础语法:

声明:XML 文件可以包含一个声明,指定 XML 的版本和编码格式。

元素:XML 中的数据存储在元素(tags)中,每个元素由开始标签、内容和结束标签组成。

John 30 属性:元素可以包含属性,属性是键值对形式的额外信息。 John 30 注释:可以在 XML 文件中使用注释。

根元素:一个有效的 XML 文件必须有一个根元素,所有其他元素都必须嵌套在根元素内。

40.2 DOM 解析方式   DOM(Document Object Model) 是一种基于树形结构的解析方式,它会将整个 XML 文档加载到内存中,形成一个文档对象模型(DOM 树)。在 DOM 中,XML 文档的每个元素都是一个节点,可以通过节点的属性、内容等进行访问和修改。

40.2.1 DOM 解析的优点和缺点 优点:

解析后的数据结构(DOM 树)可以随机访问,方便对 XML 文档进行修改。 支持对 XML 文档的增、删、改操作。 缺点:

内存开销大,适合处理小型或中型的 XML 文件。 加载整个 XML 文档需要较长的时间,处理大型文件时可能效率低下。 40.2.2 使用 DOM 解析 XML import org.w3c.dom.; import javax.xml.parsers.; import java.io.*;

public class DOMExample { public static void main(String[] args) throws Exception { File inputFile = new File(example.xml); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(inputFile);

    doc.getDocumentElement().normalize();

    NodeList nodeList = doc.getElementsByTagName(person);
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        if (node.getNodeType() == Node.ELEMENT_NODE) {
            Element element = (Element) node;
            System.out.println(Name:  + element.getElementsByTagName(name).item(0).getTextContent());
            System.out.println(Age:  + element.getElementsByTagName(age).item(0).getTextContent());
        }
    }
}

}   在上面的代码中,使用 DocumentBuilder 解析 XML 文件并创建 DOM 树。然后,使用 getElementsByTagName 获取所有 元素,并通过 getTextContent() 获取每个元素的内容。

40.3 SAX 解析方式   SAX(Simple API for XML) 是一种基于事件的解析方式,不像 DOM 那样将整个 XML 文件加载到内存中。SAX 解析器在解析 XML 时,会逐行读取并触发相应的事件(如开始标签、结束标签等)。SAX 解析方式适用于处理大型 XML 文件,因为它不会将整个文件加载到内存中,而是逐个元素处理。

40.3.1 SAX 解析的优点和缺点 优点:

内存开销小,适用于处理大型 XML 文件。 高效,适用于只读取 XML 数据的场景。 缺点:

无法随机访问 XML 数据,因为 SAX 是基于事件的,不会保留整个文档的结构。 不支持修改 XML 文件。 40.3.2 使用 SAX 解析 XML import org.xml.sax.; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.;

public class SAXExample { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(example.xml, new DefaultHandler() { boolean isName = false; boolean isAge = false;

        public void startElement(String uri, String localName, String qName, Attributes attributes) {
            if (qName.equalsIgnoreCase(name)) {
                isName = true;
            } else if (qName.equalsIgnoreCase(age)) {
                isAge = true;
            }
        }

        public void characters(char[] ch, int start, int length) {
            if (isName) {
                System.out.println(Name:  + new String(ch, start, length));
                isName = false;
            }
            if (isAge) {
                System.out.println(Age:  + new String(ch, start, length));
                isAge = false;
            }
        }
    });
}

}   在 SAX 解析中,我们通过继承 DefaultHandler 类并重写 startElement() 和 characters() 方法来处理 XML 元素的开始标签和文本内容。SAX 解析器在读取到元素时会触发这些方法。

40.4 JDOM 和 DOM4J   JDOM 和 DOM4J 是 Java 中常用的第三方 XML 处理库,它们为 XML 的解析和操作提供了更简洁和高效的 API。

40.4.1 JDOM   JDOM 提供了类似于 DOM 的树结构,但它使用 Java 的集合框架,并且操作更方便。JDOM 允许你以更直观的方式处理 XML 数据,并且在性能上相较于 DOM 更加高效。

40.4.2 DOM4J   DOM4J 是另一个流行的 XML 处理库,提供了功能强大的 XML 操作 API。DOM4J 支持 XPath、XSLT 等功能,适用于更加复杂的 XML 处理需求。

40.5 XML 与 Java 对象转换   在实际开发中,我们通常需要将 XML 与 Java 对象相互转换。常用的 XML 与 Java 对象的转换方式有两种:JAXB(Java Architecture for XML Binding)和 XStream。

40.5.1 使用 JAXB 进行 XML 与 Java 对象转换 JAXB 是 Java 提供的标准 API,用于将 Java 对象序列化为 XML,或者将 XML 反序列化为 Java 对象。

import javax.xml.bind.*;

@XmlRootElement class Person { private String name; private int age;

@XmlElement
public String getName() {
    return name;
}

@XmlElement
public int getAge() {
    return age;
}

public void setName(String name) {
    this.name = name;
}

public void setAge(int age) {
    this.age = age;
}

}

public class JAXBExample { public static void main(String[] args) throws Exception { Person person = new Person(); person.setName(John); person.setAge(30);

    // 转换 Java 对象为 XML
    JAXBContext context = JAXBContext.newInstance(Person.class);
    Marshaller marshaller = context.createMarshaller();
    marshaller.marshal(person, System.out);

    // 将 XML 转换为 Java 对象
    String xml = <person><name>John</name><age>30</age></person>;
    Unmarshaller unmarshaller = context.createUnmarshaller();
    Person personFromXML = (Person) unmarshaller.unmarshal(new StringReader(xml));
    System.out.println(personFromXML.getName() + ,  + personFromXML.getAge());
}

}   JAXB 使用 @XmlRootElement 和 @XmlElement 注解来定义类和字段的映射关系。通过 Marshaller 和 Unmarshaller,我们可以方便地将 Java 对象和 XML 进行相互转换。

小结   XML 是一种常用的数据存储和交换格式,Java 提供了多种方式来解析和生成 XML 文件。DOM 和 SAX 是两种经典的解析方式,分别适用于不同的应用场景。JDOM 和 DOM4J 提供了更高效、易用的 XML 操作 API。而通过 JAXB 等技术,我们可以方便地将 XML 与 Java 对象进行相互转换。掌握这些 XML 处理技术,可以帮助我们在开发中更好地利用 XML 进行数据存储和传输。

点赞
收藏
评论区
推荐文章
如何搞定力扣刷题?
好买网(www.goodmai.com)IT技术交易平台前言大家好,我是bigsai,好久不见!今天就给各位小伙伴分享我自己刷题力扣的一些小方法,不一定很有用但是可以参考,祝你更高效的变强!最近在一些群聊、私聊中遇到很多的一个问题就是:刷题,大家也都重视到算法刷题对冲击大厂的重要性,越来越多的人开始卷起来了!BA321C5AFE6864CE60465A0E7
Easter79 Easter79
3年前
tcpkill工作原理分析
此文已由作者张耕源授权网易云社区发布。欢迎访问网易云社区(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fsq.163yun.com%2Fblog%3Ftag%3DM_tg_648_65),了解更多网易技术产品运营经验。日常工作生活中大家在维护自己的服务器、VPS有时
从Nacos客户端视角来分析配置中心原理
Hello,大家好,我是麦洛,今天带大家一起从Nacos客户端视角来看看配置中心实现原理;整理这篇文章时候,也参照学习了部分大佬的博客,这里致谢;大家在阅读过程中如果发现错误或者问题,可以私信我交流,一起交流学习,一起进步;在开始阅读文章之前,有些思路我按我的理解先阐述一些,方便大家更快理清思路,不对的地方还请大家批评指正;1.Nacos客户端会在
Wesley13 Wesley13
3年前
3分钟搭建自己的私有云盘
!(https://oscimg.oschina.net/oscnet/535b8a9fe0d1491f700cf355e9cba0304a4.jpg)Hi!大家好呀!我是你们努力的喵哥!同学们现在使用云盘的频率还高吗?喵哥为了防止手机丢失带来的困扰,几乎是将整个手机里的照片和文档都备份到了iCloud云盘中。但是电脑上的内容的备份就比较麻烦了。
Python进阶者 Python进阶者
3年前
网页结构的简介和Xpath语法的入门教程
相信很多小伙伴已经听说过Xpath,之前小编也写过一篇关于Xpath的文章,感兴趣的小伙伴可以戳这篇文章以及。今天小编继续给大家介绍一些Xpath知识点,希望对大家的学习有帮助。1、Xpath让我们可以使用一种类似于Windows下的文件路径的方式,让我们可以定位到HTML或者XML结构中的具体元素。Xpath本身包含标一些准函数库,可以让我们的Xpath语
Stella981 Stella981
3年前
GitHub Star 10K,让你的网站更炫酷的开源库
!(https://oscimg.oschina.net/oscnet/d965c43d6fcb483facc0eb72f2996d21.png)来源:GitHub精选Hi!大家好呀!我是你们可爱的喵哥!现在不少网站都支持了骨架屏,能够在网页数据加载前,展示固定的布局,能够减少用户在进入网页时感受到白屏的不适感。今天要给大家推荐一
Stella981 Stella981
3年前
Python中的基础数据类型(String,Number)及其常用用法简析
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤寄意寒星荃不察,我以我血荐轩辕。Python中的基础数据类型前言哈喽,各位小伙伴们,相信大家和我一样,在开始接触Python这门语言的时候,会遇到很多困
Wesley13 Wesley13
3年前
(十四) 初遇python甚是喜爱之案例:CSV文件内容转换为HTML输出
各位读者大大们大家好,今天学习python的CSV文件内容转换为HTML输出,并记录学习过程欢迎大家一起交流分享。!(https://oscimg.oschina.net/oscnet/30609f3585378b89bc033d9d86d7e014c86.jpg)首先看我桌面的person\_info.csv
陈杨 陈杨
6个月前
【McCharts】基于鸿蒙ArkTS语法开发的图表组件--折线图
简介大家好,我是陈杨。今天主要是分享一下McCharts组件库中的折线图实现过程,记录并分享自己的一些开发经验,感兴趣的可以互相学习。McCharts组件库是基于鸿蒙ArkTS语法开发,支持API9以上的版本。图表组件已经开源了,大家可以一起参与进来,不管
陈杨 陈杨
3个月前
HarmonyOS5云服务技术分享--云存储SDK文章整理
在HarmonyOSArkTS应用中集成华为云存储SDK指南大家好呀!今天咱们来聊聊如何将华为云存储SDK集成到基于ArkTS(API911)的HarmonyOS应用中。这篇指南会手把手带你完成从环境准备到代码实现的完整流程,过程中遇到的常见问题也会贴心提