文章目录
- 概述
- 前期准备
- 使用
-
- 1、简单读取示例
- 2、多个标签读取示例
- 细节问题
-
- addSetNext顺序
- 参考
概述
官网
写入查看另一篇:https://blog.csdn.net/qq%5F45742250/article/details/153191615
前期准备
maven
1<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-digester3 --> 2<dependency> 3 <groupId>org.apache.commons</groupId> 4 <artifactId>commons-digester3</artifactId> 5 <version>3.2</version> 6</dependency> 7 8<dependency> 9 <groupId>org.projectlombok</groupId> 10 <artifactId>lombok</artifactId> 11 <version>1.18.36</version> 12</dependency> 13
使用
1、简单读取示例
test.xml
1<Book> 2 <Title>Java Programming</Title> 3 <Author>John Doe</Author> 4 <Price>39.99</Price> 5</Book> 6
Book.java
1public class Book { 2 private String title; 3 private String author; 4 private int price; 5 6 // getter和setter方法省略 7} 8
使用示例
1Digester digester = new Digester(); 2// 当遇到<Book>标签时,创建一个Book类的实例 3digester.addObjectCreate("Book", Book.class); 4 5// 当遇到<Book>下的<Title>标签时,将其内容设置到Book实例的title属性上 6digester.addBeanPropertySetter("Book/Title", "title"); 7 8// 对<Author>和<Price>标签做同样的操作 9digester.addBeanPropertySetter("Book/Author", "author"); 10digester.addBeanPropertySetter("Book/Price", "price"); 11 12// 文件路径 13String filePath = "demo/test.xml"; 14 15// 存储文件内容 16StringBuilder content = new StringBuilder(); 17 18try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { 19 String line; 20 while ((line = br.readLine()) != null) { 21 content.append(line).append(System.lineSeparator()); // 拼接每行 22 } 23 System.out.println(content); // 打印文件内容 24} catch (IOException e) { 25 e.printStackTrace(); 26} 27
2、多个标签读取示例
library.xml
1<Library> 2 <Book> 3 <Title>Java编程指南</Title> 4 <Author>王五</Author> 5 <Price>88</Price> 6 </Book> 7 <Book> 8 <Title>高级Java技术</Title> 9 <Author>赵六</Author> 10 <Price>120</Price> 11 </Book> 12</Library> 13
Book.java
1public class Book { 2 private String title; 3 private String author; 4 private int price; 5 6 // getter和setter方法省略 7} 8
Library.java
1public class Library { 2 private List<Book> books = new ArrayList<>(); 3 4 // getter、setter、toString方法省略 5 6 // 添加书籍到书单中 7 public void addBook(Book book) { 8 books.add(book); 9 } 10} 11
使用示例
1Digester digester = new Digester(); 2// 当遇到<Library>标签时,创建一个Book类的实例 3digester.addObjectCreate("Library", Library.class); 4 5digester.addObjectCreate("Library/Book", Book.class); 6digester.addBeanPropertySetter("Library/Book/Title", "title"); 7digester.addBeanPropertySetter("Library/Book/Author", "author"); 8digester.addBeanPropertySetter("Library/Book/Price", "price"); 9// 将解析到的 Book 对象添加到 Library 的书单中(注意这里这个addSetNext,下文有解释,必须在已经添加号Library、Book类之后) 10digester.addSetNext("Library/Book", "addBook"); 11 12// 文件路径 13String filePath = "demo/library.xml"; 14 15// 存储文件内容 16StringBuilder content = new StringBuilder(); 17 18try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { 19 String line; 20 while ((line = br.readLine()) != null) { 21 content.append(line).append(System.lineSeparator()); // 拼接每行 22 } 23 System.out.println(content); // 打印文件内容 24} catch (IOException e) { 25 e.printStackTrace(); 26} 27 28try { 29 Library library = digester.parse(new StringReader(content.toString())); 30 // 这里的xmlString是包含上面XML内容的字符串 31 32 // 输出解析结果,检查是否正确 33 System.out.println("library: " + library.toString()); 34} catch (IOException | SAXException e) { 35 e.printStackTrace(); 36} 37
细节问题
addSetNext顺序
正确做法:
1Digester digester = new Digester(); 2// 当遇到<Library>标签时,创建一个Book类的实例 3digester.addObjectCreate("Library", Library.class); 4 5digester.addObjectCreate("Library/Book", Book.class); 6digester.addBeanPropertySetter("Library/Book/Title", "title"); 7digester.addBeanPropertySetter("Library/Book/Author", "author"); 8digester.addBeanPropertySetter("Library/Book/Price", "price"); 9// (注意这里)将解析到的 Book 对象添加到 Library 的书单中 10digester.addSetNext("Library/Book", "addBook"); 11
错误做法:
1Digester digester = new Digester(); 2// 当遇到<Library>标签时,创建一个Book类的实例 3digester.addObjectCreate("Library", Library.class); 4// (注意这里)将解析到的 Book 对象添加到 Library 的书单中 5digester.addSetNext("Library/Book", "addBook"); 6 7digester.addObjectCreate("Library/Book", Book.class); 8digester.addBeanPropertySetter("Library/Book/Title", "title"); 9digester.addBeanPropertySetter("Library/Book/Author", "author"); 10digester.addBeanPropertySetter("Library/Book/Price", "price"); 11
原因:
addSetNext("Library/Book", "addBook")被提前放置,这样在Book对象还没有创建时就试图将它添加到Library的books属性中。Book对象尚未实例化,因此会引发错误或不正确的行为。addSetNext需要确保在Book被创建之后才能执行,即Book对象已经存在,才能调用Library的addBook方法。
解决方案:
为了确保 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