JAVA如何生成不是很规则的XML文件

问题描述

从java对象到xml不是难事,用xstream就可以,但是这是生成的规则的xml文件,如果有这样一个文件呢? <graph caption="Monthly Unit Sales" xAxisName="Month" yAxisName="Units" decimalPrecision="0" formatNumberScale="0"> <set name="Jan" value="462" color="AFD8F8" hoverText="Janssss.xxx" /> <set name="Feb" value="857" color="F6BD0F" /> <set name="Mar" value="671" color="8BBA00" /> <set name="Apr" value="494" color="FF8E46" /> <set name="May" value="761" color="008E8E" /> <set name="Jun" value="960" color="D64646" /> <set name="Jul" value="629" color="8E468E" /> <set name="Aug" value="622" color="588526" /> <set name="Sep" value="376" color="B3AA00" /> <set name="Oct" value="494" color="008ED6" /> <set name="Nov" value="761" color="9D080D" /> <set name="Dec" value="960" color="A186BE" /> <trendlines> <line startValue="700" color="91c728" displayValue="AVG" showOnTop="1" /> </trendlines></graph>       这个是FusionCharts,一个图型报表js,现在的要求就是从数据库读数据,生成XML然后供此JS读取生成图表   现在好像只有一个办法,就是读-->string-->append--write(XML),目前我只发现这一种方法,不知道大家还好什么好的方法没有?  或者是有没有更好的报表JS,供我参考下,但这次的重点还是怎么用java生成不是很规则的XML

解决方案

如果是数据库里出来的,我猜应该有持有化bean结构吧比如定义这种bean结构package org.chart.xml.bean;import java.util.ArrayList;import java.util.List;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;/** * 最顶层GraphTag */@XmlRootElement(name="graph")public class GraphBean {private String caption;private String xAxisName;private String yAxisName;private int decimalPrecision;private int formatNumberScale;private List<DetailInfoBean> detailList = new ArrayList<DetailInfoBean>();private TrendLinesBean trendLines;@XmlAttributepublic String getCaption() {return caption;}public void setCaption(String caption) {this.caption = caption;}@XmlAttributepublic String getxAxisName() {return xAxisName;}public void setxAxisName(String xAxisName) {this.xAxisName = xAxisName;}@XmlAttributepublic String getyAxisName() {return yAxisName;}public void setyAxisName(String yAxisName) {this.yAxisName = yAxisName;}@XmlAttributepublic int getDecimalPrecision() {return decimalPrecision;}public void setDecimalPrecision(int decimalPrecision) {this.decimalPrecision = decimalPrecision;}@XmlAttributepublic int getFormatNumberScale() {return formatNumberScale;}public void setFormatNumberScale(int formatNumberScale) {this.formatNumberScale = formatNumberScale;}@XmlElement(name="set")public List<DetailInfoBean> getDetailList() {return detailList;}public void setDetailList(List<DetailInfoBean> detailList) {this.detailList = detailList;}@XmlElement(name="trendlines")public TrendLinesBean getTrendLines() {return trendLines;}public void setTrendLines(TrendLinesBean trendLines) {this.trendLines = trendLines;}/** * 增加一个Set标签 */public void addDetail(DetailInfoBean bean) {this.detailList.add(bean);}}package org.chart.xml.bean;import javax.xml.bind.annotation.XmlAttribute;/** * Set标签内容 */public class DetailInfoBean {private String name;private String value;private String color;private String hoverText;@XmlAttributepublic String getName() {return name;}public void setName(String name) {this.name = name;}@XmlAttributepublic String getValue() {return value;}public void setValue(String value) {this.value = value;}@XmlAttributepublic String getColor() {return color;}public void setColor(String color) {this.color = color;}@XmlAttributepublic String getHoverText() {return hoverText;}public void setHoverText(String hoverText) {this.hoverText = hoverText;}}package org.chart.xml.bean;import java.util.ArrayList;import java.util.List;import javax.xml.bind.annotation.XmlElement;/** * TreadLines标签内容 */public class TrendLinesBean {private List<LineBean> lineList = new ArrayList<LineBean>();@XmlElement(name="line")public List<LineBean> getLineList() {return lineList;}public void setLineList(List<LineBean> lineList) {this.lineList = lineList;}public void addLine(LineBean bean) {this.lineList.add(bean);}}package org.chart.xml.bean;import javax.xml.bind.annotation.XmlAttribute;/** * Line标签内容 */public class LineBean {private String startValue;private String color;private String displayValue;private String showOnTop;@XmlAttributepublic String getStartValue() {return startValue;}public void setStartValue(String startValue) {this.startValue = startValue;}@XmlAttributepublic String getColor() {return color;}public void setColor(String color) {this.color = color;}@XmlAttributepublic String getDisplayValue() {return displayValue;}public void setDisplayValue(String displayValue) {this.displayValue = displayValue;}@XmlAttributepublic String getShowOnTop() {return showOnTop;}public void setShowOnTop(String showOnTop) {this.showOnTop = showOnTop;}}以上4个bean均为pojo。一般支持ORM的框架都会返回这种形式的数据结构。接下来测试类:package org.chart.xml.bean;import java.io.PrintWriter;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;public class Test {/** * 测试 */private Test() throws JAXBException {// 模拟ORM从DB中出数据GraphBean graphBean = initGraphTag();addDetail(graphBean, "Jan", "462", "AFD8F8", "Janssss.xxx");addDetail(graphBean, "Feb", "857", "F6BD0F");addDetail(graphBean, "Mar", "671", "8BBA00");addDetail(graphBean, "Apr", "494", "FF8E46");addDetail(graphBean, "May", "761", "008E8E");addDetail(graphBean, "Jun", "960", "D64646");addDetail(graphBean, "Jul", "629", "8E468E");addDetail(graphBean, "Aug", "622", "588526");addDetail(graphBean, "Sep", "376", "B3AA00");addDetail(graphBean, "Oct", "494", "008ED6");addDetail(graphBean, "Nov", "761", "9D080D");addDetail(graphBean, "Dec", "960", "A186BE");addTrendlines(graphBean);// 生成XMLprintXml(graphBean);}private GraphBean initGraphTag() {GraphBean graphBean = new GraphBean();graphBean.setCaption("Monthly Unit Sales");graphBean.setxAxisName("Month");graphBean.setyAxisName("Units");graphBean.setDecimalPrecision(0);graphBean.setFormatNumberScale(0);return graphBean;}private void addDetail(GraphBean graphBean, String... args) {DetailInfoBean detailInfo = new DetailInfoBean();if (args.length > 0) {detailInfo.setName(args[0]);}if (args.length > 1) {detailInfo.setValue(args[1]);}if (args.length > 2) {detailInfo.setColor(args[2]);}if (args.length > 3) {detailInfo.setHoverText(args[3]);}graphBean.addDetail(detailInfo);}private void addTrendlines(GraphBean graphBean) {TrendLinesBean trendLines = new TrendLinesBean();addLine(trendLines, "700", "91c728", "AVG", "1");graphBean.setTrendLines(trendLines);}private void addLine(TrendLinesBean trendLines, String... args) {LineBean line = new LineBean();if (args.length > 0) {line.setStartValue(args[0]);}if (args.length > 1) {line.setColor(args[1]);}if (args.length > 2) {line.setDisplayValue(args[2]);}if (args.length > 3) {line.setShowOnTop(args[3]);}trendLines.addLine(line);}private void printXml(GraphBean graphBean) throws JAXBException {JAXBContext context = JAXBContext.newInstance(GraphBean.class);Marshaller marshaller = context.createMarshaller();// 生成文件的话请将这里的System.out替换成FileOutputStream或者直接文件pathPrintWriter writer = new PrintWriter(System.out);marshaller.marshal(graphBean, writer);writer.close();}/** * @param args * @throws JAXBException */public static void main(String[] args) throws JAXBException {new Test();}}在控制台看结果就可以看到你的xml了这招叫jaxb2。是jdk6新增的方法,也是最快的方法,同时也是离OO和pojo最接近的方法。只需在javabean中配置annotation即可实现。一次配置永远可用
解决方案二:
不是很规则的XML文件 ?上面的 xml 内容也是一个规则的 xml,与 xml 相关的标准有很多,形式有多样。 /** * 生成 xml 内容 */ public String generate() { ByteArrayOutputStream bos = null; try { bos = new ByteArrayOutputStream(1024); // 新建 format 用来格式化 xml 文件 OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); // 编码格式 format.setIndentSize(4); // Tab 缩进 XMLWriter writer = new XMLWriter(bos, format); Document document = DocumentHelper.createDocument(); // 创建文档 Element graph = document.addElement("graph"); // 创建根节点 graph.addAttribute("caption", "Monthly Unit Sales"); // add set Element node = graph.addElement("set"); node.addAttribute("name", "Jan"); node.addAttribute("value", "462"); // add trendlines node = graph.addElement("trendlines"); // add line node = node.addElement("line"); node.addAttribute("startValue", "700"); node.addAttribute("color", "91c728"); writer.write(document); writer.flush(); writer.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException ioe) { } return bos.toString(); }输出内容:<?xml version="1.0" encoding="utf-8"?><graph caption="Monthly Unit Sales"> <set name="Jan" value="462"/> <trendlines> <line startValue="700" color="91c728"/> </trendlines></graph>
解决方案三:
使用dom4j啊只要是标准xml就可以生成

时间: 2024-09-15 18:22:37

JAVA如何生成不是很规则的XML文件的相关文章

Java解析XML文件的四种方法

1)DOM(JAXP Crimson解析器)     DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像

dom4j生成和解析xml文件

要生成和解析如下格式的xml文件:  代码如下 复制代码 <?xml version="1.0" encoding="UTF-8"?> <Message xmlns:xs="http://www.w3.org/2001/XMLSchema">   <User>     <id>1</id>     <name>李寻欢</name>     <age>3

如何将数据库的查询结果生成只存在于内存的动态XML文件

问题描述 我将做一个系统,数据保存在SQLServer数据库里,但传输数据时是用XML文件的.为了安全性和减小系统负荷,需要将查询结果生成一个存在于内存的XML文件,而不需要经过硬盘文件系统.还有,如何访问这个在内存中的XML文件?

动态-java 如何生成一个不定维数的数组?

问题描述 java 如何生成一个不定维数的数组? 现有需求如下:有一个List集合,内含N个对象,每个对象都有一个属性level.如果最大的level是5,那么就生成一个4维数组:如果最大的level是4,那就生成一个3维数组,依此类推.想了很多办法,自己实现不了,特来求助 解决方案 你这个是N很大时怎么遍历的问题么?

java class生成jar包(转)

  进入dos操作符窗口cd进入要打成jar包的class文件所有文件夹目录jar cvf [生成jar的名称.jar] [列出class文件] //若有多个,以空隔隔开 如:一.操作零散的单个或几个class文件jar cvf ibstool.jar com/cn/ibs/TurnD.class com/cn/ibs/TurnB.class 二.把一个文件夹下面的所有class文件打成jar包jar cvf ibstool.jar * 回车 生成可执行jar包:编译的class文件中必须有ma

JAVA UUID 生成

GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复. UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID package com.mytest; import java.util.UUID; public class UTest {    public static void main(S

利用Java动态生成 PDF 文档

利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那么目前最佳的解决方案,你可能会想到 iText ,对没错... iText+(Velocity / Freemarker)可以实现.不过据我熟悉,iText本身提供的HTML解析器还是不够强大,许多HTML标签和属性无法识别,更悲催的是简单的CSS它不认识,排版调整样式会让你头大的.不要失望,接下来

Java中生成随机数的实现方法总结_java

在实际开发工作中经常需要用到随机数.如有些系统中创建用户后会给用户一个随机的初始化密码.这个密码由于是随机的,为此往往只有用户自己知道.他们获取了这个随机密码之后,需要马上去系统中更改.这就是利用随机数的原理.总之随机数在日常开发工作中经常用到.而不同的开发语言产生随机数的方法以及技巧各不相同.笔者这里就以Java语言为例,谈谈随机数生成的方法以及一些技巧. 一.利用random方法来生成随机数. 在Java语言中生成随机数相对来说比较简单,因为有一个现成的方法可以使用.在Math类中,Java

java导出生成word的简单方法_java

最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. 目前来看,java导出word大致有6种解决方案: 1.Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用.DLL动态链接库的生成需要windows平台的支持.该方案只能在windows平台实现,是其局限性. 2.Apache POI包括一系列的API,它