`
johnny15963
  • 浏览: 16888 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

写附件和xml文件

 
阅读更多


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class RefreshResearchReportJob {

	private static final Logger logger = Logger
			.getLogger(RefreshResearchReportJob.class);

	public static final String ANNEX_FOLDER = "annexFolder";

	// private String startDateStr;
	private ResearchReportCenterDbService researchReportService;
	private ResearchReportCache researchReportCache;

	// public String getStartDateStr() {
	// return startDateStr;
	// }
	//
	// public void setStartDateStr(String startDateStr) {
	// this.startDateStr = startDateStr;
	// }

	public ResearchReportCenterDbService getResearchReportService() {
		return researchReportService;
	}

	public void setResearchReportService(
			ResearchReportCenterDbService researchReportService) {
		this.researchReportService = researchReportService;
	}

	public ResearchReportCache getResearchReportCache() {
		return researchReportCache;
	}

	public void setResearchReportCache(ResearchReportCache researchReportCache) {
		this.researchReportCache = researchReportCache;
	}

	public void runJob() {
		logger.info("增量更新附件启动----日期xxxx");
		
		//获取项目根目录的绝对路径
		String rootPath = "";
		String classPath = RefreshResearchReportJob.class.getResource("/../..")+"";
		rootPath = classPath.substring(classPath.indexOf("D:"));
		rootPath = rootPath.replace("/", "\\");
		
		long startMillis = System.currentTimeMillis();

		String currentTime = CalendarUtil.getCurrentTime();
		long lastReportId = 0;

		// 首先判断datas.xml文件是否存在,不存在则创建
		String xmlFilePath = rootPath + "\\reports" + "\\" + ANNEX_FOLDER;
		FileUtil.createFolder(xmlFilePath);
		String filePath = xmlFilePath + "\\" + ResearchReportAnnex.DATAS_XML;

		SAXBuilder builder = new SAXBuilder(false);
		Document document = null;
		Element rootElement = null;
		try {
			File xmlFile = new File(filePath);
			if (xmlFile.exists()) {
				document = builder.build(filePath);
				// 读取datas.xml文件,取出last-report-id作为参数去执行第一次查询
				rootElement = document.getRootElement();
				Element headElement = rootElement.getChild("head");
				lastReportId = Long.parseLong(headElement.getChild(
						"last-report-id").getText());
			} else {
				document = createDocument();
				XMLOutputter XMLOut = new XMLOutputter(FormatXML());
				try {
					XMLOut.output(document, new FileOutputStream(filePath));
				} catch (FileNotFoundException e1) {
					e1.printStackTrace();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		Date startDate = CalendarUtil.transToDate("2011-01-05");
		Date endDate = CalendarUtil.transToDate("2011-01-05");
		// 第一次查询出数据量较小的字段,放到内存中
		List<ResearchReport> reportWithAnnexList = researchReportService
				.getReportsWithAnnexes(startDate, endDate, lastReportId);
		for (int i = 0; i < reportWithAnnexList.size(); i++) {
			ResearchReport researchReport = reportWithAnnexList.get(i);

			// 放入缓存中
			researchReportCache.addResearchReport(researchReport);

			// 如果有附件,就创建相应的文件夹
			long reportId = researchReport.getId();
			String pubDateStr = CalendarUtil.getDateStr(researchReport
					.getPubDate());
			String annexPath = rootPath + "\\" + ANNEX_FOLDER+ "\\"
					+ pubDateStr + "\\" + reportId;
			List<ResearchReportBlob> reportBlobList = researchReportService
					.getReportBlobs(reportId);
			for (int j = 0; j < reportBlobList.size(); j++) {
				ResearchReportBlob reportBlob = reportBlobList.get(j);
				FileUtil.createFolder(annexPath);
				createAnnexFile(reportBlob, annexPath);

				// 如果有研究报告摘要就创建html文件展示
				createHtmlFile(reportBlob, annexPath);

				// 把记录存到datas.xml文件中
				writeDatasXml(researchReport, document, filePath);
			}
		}

		System.out.println((System.currentTimeMillis() - startMillis) / 1000
				+ "s");

	}

	public Format FormatXML() {
		// 格式化生成的xml文件,如果不进行格式化的话,生成的xml文件将会是很长的一行...
		Format format = Format.getCompactFormat();
		format.setEncoding("GBK");
		format.setIndent("    ");
		return format;
	}

	public void writeDatasXml(ResearchReport researchReport, Document document,
			String filePath) {
		String currentTime = CalendarUtil.getCurrentTime();
		long reportId = researchReport.getId();

		FileOutputStream fo = null;
		try {
			Element rootElement = document.getRootElement();

			// 操作reports的子标签
			Element reportsElement = rootElement.getChild("reports");
			List<Element> reportList = reportsElement.getChildren();
			for (int i = 0; i < reportList.size(); i++) {
				Element reportElement = reportList.get(i);
				Element reportIdElement = reportElement.getChild("id");
				String existReportId = reportIdElement.getText(); 
				if(existReportId.equals(reportId+"")){
					return;
				}
			}
			Element reportElement = addReportElement(reportsElement,
					researchReport);
			
			// 操作head的子标签
			Element headElement = rootElement.getChild("head");
			setHeadElement(headElement, currentTime, reportId);

			XMLOutputter outp = new XMLOutputter(FormatXML());
			fo = new FileOutputStream(filePath);
			outp.output(document, fo);

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			if(fo != null){
				try {
					fo.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	private Document createDocument() {
		Element rootElement = new Element("report-catalog");
		Document document = new Document(rootElement);
		addHeadElement(rootElement);
		XmlUtil.addChildElement(rootElement, "reports");
		return document;
	}

	private Element addHeadElement(Element rootElement) {
		Element headElement = XmlUtil.addChildElement(rootElement, "head");
		String currentTime = CalendarUtil.getCurrentTime();
		XmlUtil.addChildElement(headElement, "count", "0");
		XmlUtil.addChildElement(headElement, "last-report-id", "0");
		XmlUtil.addChildElement(headElement, "create-time", currentTime);
		XmlUtil.addChildElement(headElement, "update-time", currentTime);
		return headElement;
	}

	private void setHeadElement(Element headElement, String currentTime,
			long reportId) {
		Element lastReportId = headElement.getChild("last-report-id");
		lastReportId.setText(reportId + "");
		Element count = headElement.getChild("count");
		int countValue = Integer.parseInt(count.getText()) + 1;
		count.setText(countValue + "");
		Element updateTime = headElement.getChild("update-time");
		updateTime.setText(currentTime);
	}

	private Element addReportElement(Element reportsElement,
			ResearchReport report) {
		Element reportElement = XmlUtil.addChildElement(reportsElement,
				"report");
		XmlUtil.addChildElement(reportElement, "id", report.getId().toString());
		XmlUtil.addChildElement(reportElement, "title", report.getReportTitle());
		XmlUtil.addChildElement(reportElement, "authors", report.getAuthors());
		XmlUtil.addChildElement(reportElement, "level", report.getReportLevel()
				.toString());
		XmlUtil.addChildElement(reportElement, "pub-date",
				CalendarUtil.getDateStr(report.getPubDate()));
		XmlUtil.addChildElement(reportElement, "writing-date",
				CalendarUtil.getDateStr(report.getWritingDate()));
		if (report.getAnnexes() != null && report.getAnnexes().size() > 0) {
			Element annexesElement = XmlUtil.addChildElement(reportElement,
					"annexes");
			for (ResearchReportAnnex annex : report.getAnnexes()) {
				addAnnexElement(annexesElement, annex);
			}
		}
		return reportElement;
	}

	private void addAnnexElement(Element annexesElement,
			ResearchReportAnnex annex) {
		Element annexElement = XmlUtil.addChildElement(annexesElement, "annex");
		XmlUtil.addChildElement(annexElement, "id", annex.getId() + "");
		XmlUtil.addChildElement(annexElement, "name", annex.getAnnexName());
	}

	public void createAnnexFile(ResearchReportBlob reportBlob, String annxePath) {
		FileOutputStream fos;
		try {
			fos = new FileOutputStream(annxePath + "\\" + reportBlob.getId()
					+ reportBlob.getAnnexFormat());
			fos.write(reportBlob.getAnnexContent());
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void createHtmlFile(ResearchReportBlob reportBlob, String path) {
		String reportAbstract = reportBlob.getAbstractContent();
		if (reportAbstract != null && !"".equals(reportAbstract)) {
			FileUtil.createHtmlFile(path, reportBlob.getId() + "",
					reportAbstract);
		}
	}

}

分享到:
评论

相关推荐

    LabVIEW利用OLE自动化读写XML文件

    我们为什么要在LabVIEW中使用XML文件?...附件中的程序是用LabVIEW8.5开发的,其中包含了一份Sample.xml文件,供大家测试。 本程序是调用MSXML4.0接口来完成的,如果你系统里没有安装,那么将不能运行该程序。

    《使用kettle把XML文档转换成数据表结构》附件

    在这里,你需要配置XML文件的位置,指定XML文件的根节点和需要提取的元素。Kettle支持XPath表达式,可以精确地定位到XML文档的特定部分。 接下来,为了将XML数据转换为表格,我们需要使用“表输出”步骤。这一步将...

    xml+css+xsl个人简历

    1. 创建XML文件:定义简历的结构,如`&lt;name&gt;`、`&lt;education&gt;`、`&lt;experience&gt;`等元素。 2. 编写CSS文件:设定样式规则,定义各元素的显示方式。 3. 编写XSL文件:定义转换规则,将XML转换为HTML或者其他格式。 4. ...

    使用javascript解析xml文件或xml格式字符串中文WORD版

    资源名称:使用Javascript解析xml文件或xml格式字符串 中文WORD版   内容简介: 本文档主要讲述的是使用Javascript解析xml文件或xml格式字符串;javascript中,不论是解析xml文件,...

    用友NC 57凭证XMl文件

    首先,我们要明确的是,用友NC 57凭证XML文件是一种数据交换格式,用于在不同系统间传输和导入财务凭证数据。XML(eXtensible Markup Language)是一种结构化语言,具有良好的可读性和可扩展性,非常适合用于数据...

    从xml读写邮件发送邮件

    4. 写入XML:若要将已发送或接收的邮件信息保存到XML文件,可以创建新的XML文档结构,或者基于现有结构添加新节点。使用XmlElement的AppendChild方法可添加子节点,设置节点属性并保存更改。 5. 邮件发送流程: - ...

    java读写xml和用javamail收发邮件

    首先,让我们看看Java如何处理XML文件。XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它具有良好的结构和可读性。在Java中,我们通常使用DOM(Document Object Model)和SAX(Simple API ...

    TestLink转换工具,Excel和Xml文件相互转换工具

    5. 按照指定格式在excel中编写测试用例(格式与第4点中转换得到的excel格式一致即可),使用上述工具将excel转换成符合testlink规范的xml文件,然后再将xml文件导入到testlink的指定套件下即可(以导入测试用例的形式...

    xml和java bean互相转换工具包(简单易用)

    xml 与 bean 互相转换 工具类 1、bean类的属性需要遵守BEAN规范,否则 无法 读存BEAN值。 2、bean类的属性如果 是集合 只支持数组以及List、Map、Set。...源代码包及详细使用文档后续整理,欢迎使用和测试本工具包。

    《XML》实验任务书 XML Basics & DTD 答案和解答

    2、附件中提供了一个名为SpyBase的Excel文件,其中包含Alias、Mission和Spy三张数据表,请分别完成下列任务: ①.使用一个XML文档(SpyBase1.xml)来描述其中包含的所有信息,基本保持原有数据的形式(不要将三个表...

    如何导入xml如何导入xml

    这些工具可以帮助你验证XML文件的语法,查找错误,甚至进行复杂的查询和转换。例如,使用XPath(XML Path Language)可以方便地在XML文档中查找特定的数据。 8. **XML基础** 了解XML的基本结构非常重要。XML文档由...

    JAVA生成XML文件.doc

    本文档通过一个具体的示例介绍了如何使用Java语言来生成XML文件,并对代码进行了详细的解析。 #### 二、核心库与依赖 本示例使用了`org.jdom`库来处理XML的生成。JDOM(Java Document Object Model)是一个用于...

    二进制XML存储方案

    · 存储的数据中可能包括一个或者多个的文件附件,如:word文档; · 存储的数据可能被不同的平台使用,如:windows或者linux; · 作为web项目的一部分,除了提供VC的接口之外,存储的数据格式需要提供java的接口...

    iPhone/iPad 开发: 解析本地/网络上的xml文件(实例建附件)

    本文将深入探讨如何在iPhone和iPad应用中处理XML文件,以"XMLDemo"为例,来讲解相关技术。 首先,XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用在数据交换、配置文件等领域。它的结构清晰...

    C#版XML入门经典》随书源代码(推荐).zip

    例如,可以使用`Load`方法加载XML文件,然后通过`SelectNodes`或`SelectSingleNode`查询XML节点。 3. **XmlNode类**:表示XML文档中的任何节点,如元素、属性、文本等。可以对这些节点进行操作,如修改、添加、删除...

    SQLXML_Sample

    在“SQLXML_Sample”中,XML文件(如BTCAL.xml)可能包含一系列博客文章的元数据和附件信息。使用XML Schema(如BTCAL.xsd)可以定义XML文档的结构和约束,确保数据的有效性。xsd文件是XML Schema文档,它定义了XML...

    SpyBase1.xml

    2、附件中提供了一个名为SpyBase的Excel文件,其中包含Alias(间谍使用的别名)、Mission(间谍执行的任务)和Spy(间谍信息)三张数据表,请完成下列任务: 使用一个XML文档(SpyBase1.xml)来描述其中包含的所有...

    一个通过DataSet操作XML的类

    通过使用 DataSet,可以将 XML 文件读取到 DataSet 中,然后使用 DataSet 的方法来操作数据,最后将数据写回到 XML 文件中。 程序详解: 1. XML 文件内容 XML 文件的内容可以是任何格式的,但在这里,我们使用的 ...

    XML 中存储图片等二进制文件

    XML 中是可以存储图片等二进制内容,我们也常常这样做,比如我们在进行网站信息交换时,利用一个 XML 就可以实现网站信息及其信息附件的交换。实际图片等二进制不仅可转换存储在 XML 中,也可存储在 TXT 文档中,...

    xml入门经典(第5版)

    解释如何使用DOM、XPath和LINQ to XML提取数据;验证特定用于处理大文档的编程技术;详细描述如何展示不同系统使用的数据;演示一个用于出版业的实际的XML p 资源太大,传百度网盘了,链接在附件中,有需要的同学...

Global site tag (gtag.js) - Google Analytics