当前位置: 首页 > news >正文

【Java Xml】Apache Commons Digester3解析

文章目录

  • 概述
  • 前期准备
  • 使用
    • 1、简单读取示例
    • 2、多个标签读取示例
  • 细节问题
    • addSetNext顺序
  • 参考

概述

官网
写入查看另一篇:https://blog.csdn.net/qq_45742250/article/details/153191615

前期准备

maven

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-digester3 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-digester3</artifactId><version>3.2</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.36</version>
</dependency>

使用

1、简单读取示例

test.xml

<Book><Title>Java Programming</Title><Author>John Doe</Author><Price>39.99</Price>
</Book>

Book.java

public class Book {private String title;private String author;private int price;// getter和setter方法省略
}

使用示例

Digester digester = new Digester();
// 当遇到<Book>标签时,创建一个Book类的实例
digester.addObjectCreate("Book", Book.class);// 当遇到<Book>下的<Title>标签时,将其内容设置到Book实例的title属性上
digester.addBeanPropertySetter("Book/Title", "title");// 对<Author>和<Price>标签做同样的操作
digester.addBeanPropertySetter("Book/Author", "author");
digester.addBeanPropertySetter("Book/Price", "price");// 文件路径
String filePath = "demo/test.xml";// 存储文件内容
StringBuilder content = new StringBuilder();try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {String line;while ((line = br.readLine()) != null) {content.append(line).append(System.lineSeparator()); // 拼接每行}System.out.println(content);  // 打印文件内容
} catch (IOException e) {e.printStackTrace();
}

2、多个标签读取示例

library.xml

<Library><Book><Title>Java编程指南</Title><Author>王五</Author><Price>88</Price></Book><Book><Title>高级Java技术</Title><Author>赵六</Author><Price>120</Price></Book>
</Library>

Book.java

public class Book {private String title;private String author;private int price;// getter和setter方法省略
}

Library.java

public class Library {private List<Book> books = new ArrayList<>();// getter、setter、toString方法省略// 添加书籍到书单中public void addBook(Book book) {books.add(book);}
}

使用示例

Digester digester = new Digester();
// 当遇到<Library>标签时,创建一个Book类的实例
digester.addObjectCreate("Library", Library.class);digester.addObjectCreate("Library/Book", Book.class);
digester.addBeanPropertySetter("Library/Book/Title", "title");
digester.addBeanPropertySetter("Library/Book/Author", "author");
digester.addBeanPropertySetter("Library/Book/Price", "price");
// 将解析到的 Book 对象添加到 Library 的书单中(注意这里这个addSetNext,下文有解释,必须在已经添加号Library、Book类之后)
digester.addSetNext("Library/Book", "addBook");// 文件路径
String filePath = "demo/library.xml";// 存储文件内容
StringBuilder content = new StringBuilder();try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {String line;while ((line = br.readLine()) != null) {content.append(line).append(System.lineSeparator()); // 拼接每行}System.out.println(content);  // 打印文件内容
} catch (IOException e) {e.printStackTrace();
}try {Library library = digester.parse(new StringReader(content.toString()));// 这里的xmlString是包含上面XML内容的字符串// 输出解析结果,检查是否正确System.out.println("library: " + library.toString());
} catch (IOException | SAXException e) {e.printStackTrace();
}

细节问题

addSetNext顺序

正确做法:

Digester digester = new Digester();
// 当遇到<Library>标签时,创建一个Book类的实例
digester.addObjectCreate("Library", Library.class);digester.addObjectCreate("Library/Book", Book.class);
digester.addBeanPropertySetter("Library/Book/Title", "title");
digester.addBeanPropertySetter("Library/Book/Author", "author");
digester.addBeanPropertySetter("Library/Book/Price", "price");
// (注意这里)将解析到的 Book 对象添加到 Library 的书单中
digester.addSetNext("Library/Book", "addBook");

错误做法:

Digester digester = new Digester();
// 当遇到<Library>标签时,创建一个Book类的实例
digester.addObjectCreate("Library", Library.class);
// (注意这里)将解析到的 Book 对象添加到 Library 的书单中
digester.addSetNext("Library/Book", "addBook");digester.addObjectCreate("Library/Book", Book.class);
digester.addBeanPropertySetter("Library/Book/Title", "title");
digester.addBeanPropertySetter("Library/Book/Author", "author");
digester.addBeanPropertySetter("Library/Book/Price", "price");

原因:

  1. addSetNext("Library/Book", "addBook") 被提前放置,这样在 Book 对象还没有创建时就试图将它添加到 Librarybooks 属性中。Book 对象尚未实例化,因此会引发错误或不正确的行为。
  2. addSetNext 需要确保在 Book 被创建之后才能执行,即 Book 对象已经存在,才能调用 LibraryaddBook 方法。

解决方案:
为了确保 Book 对象能够正确添加到 Library 中,应该遵循以下顺序:
3. 首先创建 Library 对象。
4. 然后创建 Book 对象,并为其设置属性。
5. 最后使用 addSetNext 将创建好的 Book 对象添加到 Library 中。

参考

https://segmentfault.com/a/1190000044528235
https://juejin.cn/post/7066826274836054023
https://www.oryoy.com/news/jie-mi-apache-chu-li-xml-de-du-xie-ji-qiao-qing-song-jia-yu-fu-za-shu-ju-jie-gou.html

http://www.dtcms.com/a/477620.html

相关文章:

  • 一文读懂微软 MOS 国际认证
  • 微软Defender for Endpoint漏洞3个月未修复,攻击者可绕过认证并上传恶意文件
  • 柱状图的高级玩法:分组、堆叠、百分比对比
  • 湖南金科建设有限公司网站那些网站是做俄罗斯鞋子
  • 详解Jenkins 的 Declarative Pipeline中post 语法
  • 淘宝客怎么在网站做推广上海新闻坊
  • 无人机中继器模式技术对比
  • HTTP与HTTPS:从明文到加密的Web安全革命
  • LINUX1013 shell:sed ./sed.sh 1.txt sed -f sed.sh 1.txt awk
  • 无人机技术解析:遥传、数传与图传的核心作用
  • 反无人机和反无人机系统(C-UAS)技术
  • 基于ARM+FPGA的无人机数据采集卡,6通道24bit采集
  • 扬州哪里做网站玉树营销网站建设公司
  • 【Linux指南】Linux命令行进度条实现原理解析
  • 如何基于ElasticsearchRetriever构建RAG系统
  • 网站建设内容与实现功能免费信息发布网有哪些
  • 【Java】nacos的作用(事例)以及其如何发挥功能的?
  • 杨辉三角的变形
  • 试从源码角度分析Handler的post和sendMessage方法的区别和应用场景?
  • 网站流量如何突破厦门建设局局长李德才
  • 外包网站设计网站建设的主要技术路线
  • iOS 26 电耗监测与优化,耗电问题实战 + 多工具 辅助策略
  • 企业前端网站模板下载 HTML前端模板网站
  • 【RabbitMQ】 RabbitMQ Overview
  • uniapp+vue3+vite+ts+xr-frame实现ar+vr渲染踩坑记
  • 如何选择适合的加密方法来保护云计算中的数据
  • Linux 云计算核心技术:原理、组件与 K8s 实战部署
  • aws docker安装,ec2安装docker-compose
  • 2025上海国际数据中心及云计算产业展览会影响力如何?有啥亮点?
  • 关于网站建设的意义亚马逊计划裁员1万人