从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结构
[code="java"]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 detailList = new ArrayList();
private TrendLinesBean trendLines;
@XmlAttribute
public String getCaption() {
return caption;
}
public void setCaption(String caption) {
this.caption = caption;
}
@XmlAttribute
public String getxAxisName() {
return xAxisName;
}
public void setxAxisName(String xAxisName) {
this.xAxisName = xAxisName;
}
@XmlAttribute
public String getyAxisName() {
return yAxisName;
}
public void setyAxisName(String yAxisName) {
this.yAxisName = yAxisName;
}
@XmlAttribute
public int getDecimalPrecision() {
return decimalPrecision;
}
public void setDecimalPrecision(int decimalPrecision) {
this.decimalPrecision = decimalPrecision;
}
@XmlAttribute
public int getFormatNumberScale() {
return formatNumberScale;
}
public void setFormatNumberScale(int formatNumberScale) {
this.formatNumberScale = formatNumberScale;
}
@XmlElement(name="set")
public List getDetailList() {
return detailList;
}
public void setDetailList(List detailList) {
this.detailList = detailList;
}
@XmlElement(name="trendlines")
public TrendLinesBean getTrendLines() {
return trendLines;
}
public void setTrendLines(TrendLinesBean trendLines) {
this.trendLines = trendLines;
}
/**
}[/code]
[code="java"]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;
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlAttribute
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@XmlAttribute
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@XmlAttribute
public String getHoverText() {
return hoverText;
}
public void setHoverText(String hoverText) {
this.hoverText = hoverText;
}
}[/code]
[code="java"]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 lineList = new ArrayList();
@XmlElement(name="line")
public List getLineList() {
return lineList;
}
public void setLineList(List lineList) {
this.lineList = lineList;
}
public void addLine(LineBean bean) {
this.lineList.add(bean);
}
}[/code]
[code="java"]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;
@XmlAttribute
public String getStartValue() {
return startValue;
}
public void setStartValue(String startValue) {
this.startValue = startValue;
}
@XmlAttribute
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@XmlAttribute
public String getDisplayValue() {
return displayValue;
}
public void setDisplayValue(String displayValue) {
this.displayValue = displayValue;
}
@XmlAttribute
public String getShowOnTop() {
return showOnTop;
}
public void setShowOnTop(String showOnTop) {
this.showOnTop = showOnTop;
}
}[/code]
以上4个bean均为pojo。一般支持ORM的框架都会返回这种形式的数据结构。
接下来测试类:
[code="java"]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);
// 生成XML
printXml(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或者直接文件path
PrintWriter 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();
}
}
[/code]
在控制台看结果就可以看到你的xml了
这招叫jaxb2。是jdk6新增的方法,也是最快的方法,同时也是离OO和pojo最接近的方法。只需在javabean中配置annotation即可实现。一次配置永远可用
使用dom4j啊
只要是标准xml就可以生成
不是很规则的XML文件 ?
上面的 xml 内容也是一个规则的 xml,与 xml 相关的标准有很多,形式有多样。
[code="java"] /**
* 生成 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();
}[/code]
输出内容:
[code="html"]<?xml version="1.0" encoding="utf-8"?>
[/code]