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

[Java]_[初级]_[使用SAX流的方式写入XML文件]

场景

  1. 文件的写入目前没有发现可以增量写入的,只能是完全重新写入。对于大量数据需要写入XML文件,还是和读XML文件一样,不需要生成DOM模型能节省不少的内存和指令。

说明

  1. java标准库里,也是有相关的SAX类来写入数据流,StreamResult(OutputStream)负责把数据写入输出流。
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;FileOutputStream fo = new FileOutputStream(file);
StreamResult streamResult = new StreamResult(fo);
  1. 之后创建一个TransformerHandler来负责绑定StreamResult并开始写入元素名称,元素值,属性值,子元素等。

  2. Handler还可以设置输出是否带缩进,输出的编码格式。

例子

  1. 这里例子是生成sitemap.xml文件,这里的SitemapMap对象。SitemapReader

SitemapWriter


import Sitemap;
import StringUtils;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.List;public class SitemapWriter {public boolean writeToFile(File file, List<Sitemap> sitemaps){SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();URL resource = this.getClass().getResource("/");String path = resource.getPath();boolean result = false;try(FileOutputStream fo = new FileOutputStream(file);) {TransformerHandler handler = factory.newTransformerHandler();Transformer transformer = handler.getTransformer();transformer.setOutputProperty(OutputKeys.INDENT, "yes");transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");StreamResult streamResult = new StreamResult(fo);handler.setResult(streamResult);handler.startDocument();AttributesImpl attributes = new AttributesImpl();attributes.addAttribute("","","xmlns","","http://www.sitemaps.org/schemas/sitemap/0.9");attributes.addAttribute("","","xmlns:xhtml","","http://www.w3.org/1999/xhtml");handler.startElement("", "", "urlset", attributes);attributes.clear();// urlfor (int i = 0; i < sitemaps.size(); i++) {Sitemap one = sitemaps.get(i);handler.startElement("","","url",null);handler.startElement("","","loc",null);String loc = StringUtils.nullToEmpty(one.getStr("loc"));handler.characters(loc.toCharArray(), 0, loc.length());handler.endElement("","","loc");handler.startElement("","","priority",null);String priority = StringUtils.nullToEmpty(one.getStr("priority"));handler.characters(priority.toCharArray(), 0, priority.length());handler.endElement("","","priority");handler.startElement("","","lastmod",null);String lastmod = StringUtils.nullToEmpty(one.getStr("lastmod"));handler.characters(lastmod.toCharArray(), 0, lastmod.length());handler.endElement("","","lastmod");handler.startElement("","","changefreq",null);String changefreq = StringUtils.nullToEmpty(one.getStr("changefreq"));handler.characters(changefreq.toCharArray(), 0, changefreq.length());handler.endElement("","","changefreq");handler.endElement("","","url");}handler.endElement("","","urlset");handler.endDocument();result = true;} catch (TransformerConfigurationException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();}return result;}
}

TestSitemapWriter

import Sitemap;
import SitemapReader;
import SitemapWriter;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;import javax.xml.transform.sax.SAXTransformerFactory;
import java.io.File;
import java.net.URL;
import java.util.List;@RunWith(JUnit4.class)
public class TestSitemapWriter {@Testpublic void testSitemapWriter(){SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();URL resource = this.getClass().getResource("/");String path = resource.getPath();File file = new File(path+"..\\..\\..\\..\\doc\\tests\\xml\\sitemap.xml");SitemapReader sr = new SitemapReader();if(sr.readAll(file)){List<Sitemap> sitemaps = sr.getSitemaps();file = new File(path+"\\sitemap.xml");SitemapWriter writer = new SitemapWriter();writer.writeToFile(file,sitemaps);}}
}

参考

  1. Java——SAX方式生成XML

  2. SAXTransformerFactory

  3. 以SAX流的方式高效读取XML大文件

相关文章:

[Java]_[初级]_[使用SAX流的方式写入XML文件]

场景 文件的写入目前没有发现可以增量写入的&#xff0c;只能是完全重新写入。对于大量数据需要写入XML文件&#xff0c;还是和读XML文件一样&#xff0c;不需要生成DOM模型能节省不少的内存和指令。 说明 在java标准库里&#xff0c;也是有相关的SAX类来写入数据流&#xf…...

java里面封装https请求工具类

1.工具类如下 Component Slf4j public class RestClientUtil<T> {private final RestTemplate restTemplate;public RestClientUtil() {this.restTemplate new RestTemplate();}public JSONObject uploadFile(String url, String fileUrl) throws IOException {List<…...

uniApp常见面试题-附详细答案

uniApp中如何进行页面跳转&#xff1f; 答案&#xff1a;可以使用uni.navigateTo、uni.redirectTo和uni.reLaunch等方法进行页面跳转。其中&#xff0c;uni.navigateTo可以实现页面的普通跳转&#xff0c;uni.redirectTo可以实现页面的重定向跳转&#xff0c;uni.reLaunch可以实…...

Java“牵手”1688整店商品API接口数据,通过店铺ID获取整店商品详情数据,1688店铺所有商品API申请指南

1688平台店铺所有商品数据接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688整店的商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、价格信息等详细信息 。 获取店铺所有商品接口API是一种用于获取电商平台上商品详…...

数据进制的转换

其他进制转换为十进制 通过按权展开法转换 十进制转换为其他进制 通过短除法转换&#xff08;注意计算结果是倒着的&#xff09; 例如将十进制的94转换为二进制 二进制转八进制和十六进制 3位二进制数表示1位八进制数&#xff0c;4位二进制数表示1位十六进制数 同理八进制数…...

如何分析识别文章/内容中高频词和关键词?

theme: orange 要分析一篇文章的高频词和关键词&#xff0c;可以使用 Python 中的 nltk 库和 collections 库或者jieba库来实现&#xff0c;本篇文章介绍基于两种库分别实现分析内容中的高频词和关键词。 nltk 和 collections 库 首先&#xff0c;需要安装 nltk 库和 collectio…...

Windows7安装SSH客户端的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

力扣:81. 搜索旋转排序数组 II(Python3)

题目&#xff1a; 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 [nums[k], nums[k1], .…...

TCP IP网络编程(三) 地址族与数据序列

文章目录 分配给套接字的IP地址与端口号网络地址网络地址分类与主机地址边界 地址信息的表示表示 IPv4地址的结构体结构体sockaddr_in 的成员分析 网络字节序与地址变换字节序与网络字节序字节序转换 网络地址的初始化与分配将字符串信息转换为网络字节序的整数型网络地址初始化…...

对比Flink、Storm、Spark Streaming 的反压机制

分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程&#xff08;Backpressure Thread&#xff09;&#xff0c;这个线程一但检测到 Bolt 里的接收队列&#xff08;recv queue&#xff09;出现了…...

Ubuntu常用配置集合

Ubuntu配置软件镜像源 参考文章&#xff1a;Ubuntu如何配置软件镜像源 建议使用清华的源。 Ubuntu安装SSH服务&#xff1a; 参考文章&#xff1a;Ubuntu安装SSH服务 ubuntu下安装使用nvm 参考文章&#xff1a;ubuntu下安装使用nvm 出现下载sh文件不成功的情况&#xff0c;…...

传统三维重建和深度学习三维重建 MVS笔记总结、问题总结

什么是cost-volume ?(代价体) 什么是置信度?置信区间? pixel-wise,patch-wise,image-wise的区别 图像 4领域-8领域-16领域 及代码实现 文章目录 1 plane-sweeping2 传统三维重建深度学习三维重建有何不同呢?3 大型场景重建4 PMVS-精确、密集、鲁棒的多视图立体视觉…...

Ansible学习笔记10

1、在group1的被管理机里的mariadb里创建一个abc库&#xff1b; 1&#xff09; 然后我们到agent主机上进行检查&#xff1a; 可以看到数据库已经创建成功。 再看几个其他命令&#xff1a; #a组主机重启mysql&#xff0c;并设置开机自启 ansible a -m service -a "namemy…...

肖sir__linux详解__002(系统命令)

linux系统命令 1、df 查看磁盘使用情况 &#xff08;1&#xff09;df 查看磁盘使用情况&#xff08;按kb单位显示&#xff09; &#xff08;2&#xff09;df -h 按单位显示磁盘使用情况 2、top 实时查看动态进程 &#xff08;1&#xff09;top 详解&#xff1a; 第一行&…...

AI绘画:StableDiffusion实操教程-斗罗大陆2-江楠楠-常服(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程&#xff1a;“AI绘画&#xff1a;Stable Diffusion 终极宝典&#xff1a;从入门到精通 ” 尽管如此&#xff0c;还有读者反馈说&#xff0c;尽管已经成功安装&#xff0c;但生成的图片与我展示的结果相去甚远。真实感和质感之…...

JavaScript运行机制与实践应用

一、JavsScript运行机制 1、JavaScript 是一种解释型语言&#xff0c;它的执行机制主要包括以下几个步骤&#xff1a; 2、事件循环 3、JavaScript运行模型 4、JavaScript任务 5、JavaScript宏任务和微任务 6、案例分析 console.log(script start) setTimeout(function () {co…...

【算法奥义】最大矩形问题

首先建立一个二维数组&#xff0c;这个二维数组&#xff0c;计算出矩阵的每个元素的左边连续 1 的数量&#xff0c;使用二维数组 left记录&#xff0c;其中left[i][j] 为矩阵第 i 行第 j 列元素的左边连续 1 的数量。 也就是从这个元素开始&#xff0c;从右往左边数有多少个连…...

06 Kafka线上集群部署方案

kafka部署在linux上有什么好处 网络传输效率 kafka部署在linux上&#xff0c;可以用到linux的零拷贝提升网络传输效率&#xff0c;提高kafka的吞吐量。利用零拷贝可以使数据不经过用户态直接通过网卡发送给接收方&#xff0c;实现数据的高性能传输 kafka和零拷贝技术 kafka…...

flex-shrink计算题

当我们使用 flexbox 布局时&#xff0c;flex-shrink 属性用于指定 flex 项在空间不足时收缩的比例。它表示了一个 flex 项相对于其他 flex 项收缩的比例。 假设有一个 flex 容器&#xff0c;其中包含三个子项&#xff0c;它们的 flex-shrink 分别设置为 1、2 和 3。当容器的可…...

Springboot - 5.Bean的生命周期

✍1. Bean的生命周期&#xff1a; 当然&#xff0c;我会详细描述每一步的作用。 &#x1f3b7;1. 实例化Bean: 这是Bean生命周期的第一步。Spring容器通过反射机制创建Bean的实例。public class ExampleBean {// ... }&#x1f3b7;2. 设置Bean的属性: Spring容器将根据配置…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...