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

这篇具有很好参考价值的文章主要介绍了[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();

            // url
            for (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 {

    @Test
    public 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大文件文章来源地址https://www.toymoban.com/news/detail-692992.html

到了这里,关于[Java]_[初级]_[使用SAX流的方式写入XML文件]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • qt xml文件写入读取

    ****************************************************************************** QT       += core gui xml ****************************************************************************** #include \\\"mainwindow.h\\\" #include QDomDocument #include QTextStream #include QFile #include QDebug MainWindow::MainWindow(QWidget *parent)     : QMainWindow(parent) {    

    2024年02月09日
    浏览(42)
  • 【加强版】SAX解析XML返回对应格式的Map对象(解决元素递归嵌套)

    SAX解析XML返回对应格式的Map对象_辛丑年正月十五的博客-CSDN博客        上篇文章实现了xml元素节点的解析并返回了对应格式的Map对象,但是遗留了一个问题,就是当xml中的元素存在递归嵌套时就解析不了,因为qname属性会重复,导致后一个元素会覆盖前一个元素。     

    2024年02月10日
    浏览(44)
  • 解析xml文件,获取需要的数据并写入txt文件中

    =_=  话不多说!直接上代码!=_= 1、XmlUtil.java     xml解析工具类  2、测试代码 解析xml方式还有很多种,这只是其中一种,可以参考:Java XML解析 - 利用dom(org.w3c.dom)解析XML  

    2024年02月14日
    浏览(39)
  • 【196】JAVA8 用 DOM 方式的 API 解析XML文件,无需引入第三方依赖。

    JAVA8 可以使用标准的 DOM 方式的 API 来编写代码解析 XML 文件,无需引入第三方依赖。下面是两个测试用的 XML 文件: test.xml test2.xml 负责接收所有信息的 AllDataDTO.java 负责接收用户信息的 AllDataUserDTO.java 处理 XML 文件的工具类,XmlUtils.java 用于测试效果的类 Main.java 输出结果:

    2024年01月22日
    浏览(41)
  • Spring CORS 跨域使用与原理(@CrossOrigin注解,Java配置类方式,xml方式)

    出于安全原因,浏览器禁止AJAX调用当前源之外的资源。 跨域资源共享(CORS)是由大多数浏览器实现的W3C规范,它允许您以一种灵活的方式指定授权哪种跨域请求,而不是使用一些不太安全、功能不太强大的hack(如IFrame或JSONP)。 Spring Framework 4.2 GA为CORS提供了一流的开箱即用支持

    2024年02月08日
    浏览(60)
  • Java创建txt文件并存入内容】—— 使用Java编写代码创建和写入文本文件

    Java创建txt文件并存入内容】—— 使用Java编写代码创建和写入文本文件 文件操作是在软件开发中常见的任务之一。在Java中,你可以使用标准的I/O类来创建和写入文本文件。下面是使用Java编写的示例代码,演示了如何创建一个txt文件并将内容写入其中。 以上代码演示了如何创

    2024年02月05日
    浏览(55)
  • SSM项目集成Spring Security 4.X版本(使用spring-security.xml 配置文件方式)

    目录 前言 实战开发: 一、Spring Security整合到SSM项目 1. pom文件引入包 2. web.xml 配置 3. 添加 spring-security.xml 文件 二、Spring Security实战应用 1. 项目结构 2. pom文件引入 3. web.xml 配置 4. Spring 配置 applicationContext.xml 5. spring-security.xml 配置 6. springmvc.xml 配置 7. 创建实体类 8. DAO层实

    2024年01月24日
    浏览(53)
  • java使用DOM4j解析XML文件

    dom4j是java中的XML API,性能优异、功能强大、开放源代码。 也是所有解析XML文件方法中最常用的! 准备需要j的ar包添加到lib目录下,dom4j-2.1.1.jar(网上随便找一个) 新建项目,在项目下创建info.xml  创建类Test,再使用DOM4j实现对XML文件增删改查 1、获取Document对象 2、展示所有的手机

    2024年02月09日
    浏览(45)
  • java 解读zip文件,获取压缩包内各文件的流的集合

    解读zip文件,把zip文件内的众文件转化成流集合,方便其他后续操作

    2024年02月10日
    浏览(55)
  • 【C++】文件IO流及stringstream流的使用

    我们在OJ的时候经常会用到while(cin str),这里的流提取实际上是个阻塞操作,只要缓冲区还有数据就继续读,默认以空格或者换行结束,有空格说明是把两段字符串尾插到str。 那么它是怎么结束呢? 答案是输入 [Ctrl]-c 或者 [Ctrl]-z + 换行 。 [Ctrl]-c 是发送信号结束进程。 [Ctrl

    2023年04月27日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包