文档章节

实现类似OSChina博客的导出功能

Harmel
 Harmel
发布于 2015/08/14 18:05
字数 479
阅读 149
收藏 5

实现原理:从数据库中查询出所有的文章信息,将文章信息转成XML文档,再通过XSLT文档对其转换成HTML文档后进行下载。

1、将文章信息转成XML文档

private static Document articlesToXML(List<Article> articles, String title) {
    Document doc = DocumentHelper.createDocument();
    Element root = doc.addElement("articles").addAttribute("title", title);
    for (Article article : articles) {
        Element articleEle = root.addElement("article");
        articleEle.addElement("title").setText(article.getTitle());
        articleEle.addElement("content").setText(article.getContent());
    }
    return doc;
}

转换后的XML类似于如下

<?xml version="1.0" encoding="UTF-8"?>
<articles title="我的博客">
    <article>
        <title>文章标题</title>
        <content>文章内容</content>
    </article>
</articles>

2、将XML文档转成HTML

public static byte[] articlesToHTML(List<Article> articles, String title) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        TransformerFactory factory = TransformerFactory.newInstance();
        InputStream in = ArticleUtils.class.getClassLoader().getResourceAsStream("article.xsl");
        Source xlst = new StreamSource(in);
        Transformer transformer = factory.newTransformer(xlst);
        Source xmlSource = new DocumentSource(articlesToXML(articles, title));
        Result outputTarget = new StreamResult(out);
        transformer.transform(xmlSource, outputTarget);
        in.close();
    } catch (Exception e) {
        throw new RuntimeException("文章集合转HTML数据失败", e);
    }
    return out.toByteArray();
}

XSLT文档

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
                <title>
                    <xsl:value-of select="/articles[@title]/@title" />
                </title>
                <style type="text/css">
                    body{
                        background-color: #F5F5F5;
                        color: #797979;
                    }

                    h2{
                        color: #2B9B70;
                        margin: 15px;
                    }
                    
                    .article{
                        margin: 15px;
                        background-color: white;
                    }

                    .article_title {
                        color: #2B9B70;
                        font-size: 20px;
                        border-bottom: 1px dashed #2B9B70;
                        padding: 10px;
                    }

                    .article_content {
                        padding: 8px 15px;
                        line-height: 1.8;
                    }
                </style>
            </head>
            <body>
                <h2><xsl:value-of select="/articles[@title]/@title" /></h2>
                <xsl:apply-templates />
            </body>
        </html>
    </xsl:template>
    <xsl:template match="article">
        <div class="article">
            <div class="article_title">
                <xsl:value-of select="title" disable-output-escaping="yes" />
            </div>
            <div class="article_content">
                <xsl:value-of select="content" disable-output-escaping="yes" />
            </div>
        </div>
    </xsl:template>
</xsl:stylesheet>

3、实现下载 -- Struts2

public class ExportAction extends BaseAction {

    @Resource(name = "articleService")
    private ArticleService articleService;

    // 文件名
    public String getFileName() throws IOException {
        String blogTitle = (String) application.get("blog_title");
        String fileName = blogTitle + "-" + DateUtils.getDate(new Date(), "yyyyMMddHHmmss") + ".html";
        // 解决火狐和IE文件名编码差异
        HttpServletRequest request = ServletActionContext.getRequest();
        String agent = request.getHeader("user-agent");
        if (agent.contains("Firefox")) {
            fileName = "=?UTF-8?B?" + new BASE64Encoder().encode(fileName.getBytes("UTF-8")) + "?=";
        } else {
            fileName = URLEncoder.encode(fileName, "UTF-8");
        }
        return fileName;
    }

    // 下载流
    public InputStream getTargetFile() {
        String blogTitle = (String) application.get("blog_title");
        byte[] bytes = ArticleUtils.articlesToHTML(articleService.findAllArticles(), blogTitle);
        return new ByteArrayInputStream(bytes);
    }

}

Struts2配置文件

<action name="export" class="exportAction">
    <result type="stream">
        <param name="inputName">targetFile</param>
        <param name="contentType">text/html</param>
        <param name="contentDisposition">attachment;filename=${fileName}</param>
    </result>
</action>

© 著作权归作者所有

共有 人打赏支持
Harmel
粉丝 9
博文 33
码字总数 14582
作品 0
武汉
程序员
wordpress博客批量导入OSchina博客

wordpress博客批量导入OSchina博客 Wordpress有同步文章到百度hi空间、新浪博客等的插件,没有同步到OSchina博客的插件,而OSChina也没有提供博客导入的功能。就简单用代码(java)实现了这功能...

youthflies
2013/09/28
0
4
oschina导出博客获取图片

oschina通过“博客导出”功能可以导出不带图片的html文档,img标签中的src全部指向oschina,如何获取这些博客中的图片: 1、解析出导出博客的图片地址,下载图片,为图片命名并修改src属性值...

樂天
2013/01/25
0
0
OSCHINA 博客新增导出所有文章的功能

继年前刚推出的使用 Live Writer 写博客的功能后。 OSCHINA 的博客新增导出所有文章的功能,进入个人空间管理 -> 博客管理 -> 博客导出,便会弹出下载对话框,备份的文件是 html 格式,可以直...

红薯
2012/01/25
3.2K
34
介绍一款开源的类Excel电子表格软件

Excel一直以霸主的地位,占据了Windows桌面表格软件市场No 1,与此同时,Office套装产品几乎成为了IT行业的标配办公技能。有无类似Excel的桌面程序,绿色版,实现基本的数据编辑功能呢? 假如...

葡萄城控件技术团队
2014/10/09
2.8K
2
【白话设计模式五】工厂方法模式(Factory Method)

白话设计模式 工厂模式 单例模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式...

陶邦仁
2016/02/19
413
0

没有更多内容

加载失败,请刷新页面

加载更多

活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用

人工智能和机器学习是全球关注的新趋势,也是当前最火爆、最流行的话题。当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽;当你拿起P20拍照时,它将自动识别场景进行最美优...

华为终端开放实验室
17分钟前
1
0
匹配两位小数,js正则

var regex = /^\d*(\.[1-9]|\.\d[1-9])*$/ console.log(1.2,regex.test(1.2)); console.log(0.3,regex.test(0.3)); console.log(1.03,regex.test(1.03)); ......

微信小程序-暗潮
21分钟前
1
0
905. Sort Array By Parity - LeetCode

Question 905. Sort Array By Parity Solution 题目大意:数组排序,偶数放前,奇数在后,偶数的数之间不用管顺序,奇数的数之间也不用管顺序 思路:建两个list,一个放偶数,一个放奇数,最...

yysue
26分钟前
1
0
h5 禁止手机自带键盘弹出

html: <div style="width: 350px;margin:50px auto;"><input type="text" id="datePicker" class="date_picker form-control" placeholder="点击选择入住日期" /></div> js: $("#date......

Delete90
43分钟前
1
0
color透明度对照表

透明度百分比 数值 100% 不透明 FF 95% F2 90% E6 85% D9 80% CC 75% BF 70% B3 65% A6 60% 99 55% 8C 50% 80 45% 73 40% 66 35% 59 30% 4D 25% 40 20% 33 15% 26 10% 1A 5% 0D 0% 完全透明 ......

_无问西东
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部