XML数据输出
来源:互联网 发布:navicat 看不到数据库 编辑:程序博客网 时间:2024/06/06 17:46
工作中涉及到XML数据输出,每年报表都会有局部指标的变化,相应的XML节点也会有相应的变更,同时还需能导出往年的数据。这样的要求,需要我们对数据库表的设计的时候采用行设计来。
数据表的设计:
当报表变化增加指标时,只需增加一行数据即可。
XML节点表设计:
输出XML每种报表都有有三个共同特点,,一是取数据,二是取节点,三是数据和节点的组合。代码设计如下
基类:
/** * XML数据输出 * @author Administrator * * @param <T> */public abstract class GenerateXML<T> {/** * 获取节点数据 * @param paramMap * @return */protected abstract List<T> getNodeData(Map<String,Object> paramMap);/** * 获取节点XML配置 * @param paramMap * @return */protected abstract List<NodeXMLInfo> getNodeXML(Map<String,Object> paramMap);/** * 组装节点 * @param root * @param paramMap * @return */public abstract Element assemblyNode(Element root, Map<String,Object> paramMap, int signNode) throws Exception; }
子类:业务类
/** * 银行利润表XML * @author Administrator * */public class BankProfitXML extends GenerateXML<BankProfitInfo> {@Overrideprotected List<BankProfitInfo> getNodeData(Map<String,Object> paramMap) { return null;}@Overrideprotected List<NodeXMLInfo> getNodeXML(Map<String,Object> paramMap) {return null;}@Overridepublic Element assemblyNode(Element root, Map<String,Object> paramMap, int signNode) throws Exception{ List<BankProfitInfo> bpDatas = getNodeData(paramMap);List<NodeXMLInfo> nxNodes = getNodeXML(paramMap);Element changeNode = root; for(NodeXMLInfo vNx : nxNodes){//节点//生成节点路径String[] nodeSplit = vNx.getXmlPathNode().split("/");for (int i=0; i<nodeSplit.length; i++){String nodeName = nodeSplit[i]; if (changeNode.getChild(nodeName) != null) {//节点存在changeNode = (Element) changeNode.getContent((changeNode.getChildren().size())-1);}else {//创建新节点changeNode.addContent(new Element(nodeName));}}//根据具体情况做处理//生成末级节点--这里要 根据数据的类型进行相应的转换String lastNodeName = vNx.getXmlLastNode();//末级节点String dataField = vNx.getDataField();//对应数据字段属性int rowOrder = vNx.getRowOrder();Double nodeValue = 0.0;for(BankProfitInfo vBp : bpDatas){//数据if(vBp.getRowOrder().intValue()==rowOrder){nodeValue = (Double)vBp.getClass().getField(dataField).get(vBp);break;}} changeNode.addContent(new Element(lastNodeName).addContent(nodeValue.toString()));} return changeNode; }}
如果存储数据内容采用了列式存储,组合代码变更如下:
List<BankProfitInfo> bpDatas = getNodeData(paramMap);List<NodeXMLInfo> nxNodes = getNodeXML(paramMap);Element changeNode = root;Boolean repeatNode;for(BankProfitInfo vBp : bpDatas){//数据repeatNode = true;//指定重复节点for(NodeXMLInfo vNx : nxNodes){//节点//生成节点路径String[] nodeSplit = vNx.getXmlPathNode().split("/");for (int i=0; i<nodeSplit.length; i++){String nodeName = nodeSplit[i]; if (changeNode.getChild(nodeName) != null) {//节点存在if ((i==signNode)&&(repeatNode==true)){//指定继续生成节点changeNode.addContent(new Element(nodeName));changeNode = (Element) changeNode.getContent((changeNode.getChildren().size())-1);}else{//获取节点的子节点changeNode = (Element) changeNode.getContent((changeNode.getChildren().size())-1);}}else {//创建新节点changeNode.addContent(new Element(nodeName));}if(i==signNode) repeatNode = false;}//生成末级节点--这里要 根据数据的类型进行相应的转换String lastNodeName = vNx.getXmlLastNode();//末级节点String dataField = vNx.getDataField();//对应数据字段属性Double nodeValue = (Double)vBp.getClass().getField(dataField).get(vBp);changeNode.addContent(new Element(lastNodeName).addContent(nodeValue.toString()));} }
0 0
- XML数据输出
- java输出xml数据
- yii2 输出xml格式数据
- asp.net输出纯xml格式数据
- asp.net输出纯xml格式数据
- xml数据写入到输出流中
- 【学习OpenCV】内存数据输出至xml
- aspx 输出 xml格式的接口数据
- Yii2 输出xml格式数据的方法
- 在Android中操作XML数据-读取与解析XML数据/生成与输出XML数据
- 输出XML
- 从数据库中读取出数据,然后用XML输出
- ExecuteXmlReader 输出很长的xml数据时出错
- Asp.net(C#) 输出Xml格式数据---Rss生成
- 使用JDOM读取XML文件,并输出其中的数据
- Spring集成Jackson输出非Null数据之XML配置
- Android使用DOM生成和输出XML格式数据
- 输出数据到xml文件(java实现)
- apache 限制IP访问
- 【LA3882】约瑟夫问题变形学习
- Getting started with SQLite in C#
- 原型模式(prototype)
- UITableView编辑模式
- XML数据输出
- 【原创】bash安装配置
- 悠悠春天的味道
- ipv4和ipv6的区别
- 《APUE》Chapter 8 Process control(学习笔记加上自己的代码)
- Microsoft Team Foundation Server 2010安装与序列号
- Excel VBA 锁定特定单元格
- JSP的中文乱码解决方案
- Http Message