XML数据输出

工作中涉及到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> {

	@Override
	protected List<BankProfitInfo> getNodeData(Map<String,Object> paramMap) { 
		return null;
	}

	@Override
	protected List<NodeXMLInfo> getNodeXML(Map<String,Object> paramMap) {
		return null;
	}
	
	@Override
	public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 提供了许多用于操作 XML 的 API,其中比较常用的有 DOM、SAX 和 StAX。其中,StAX 是一种基于流的 API,它提供了一种逐行读写 XML 文档的方式,适合于处理大型 XML 文件或数据流。 StAX API 定义了两个主要的类:XMLStreamReader 和 XMLStreamWriter。其中,XMLStreamWriter 是用于将 XML 文档输出到流中的类。要使用 XMLStreamWriter 来输出 XML 文档,可以按照以下步骤进行: 1. 创建一个 XMLStreamWriter 对象,通常需要指定一个输出流作为参数。 2. 使用 XMLStreamWriter 写入 XML 文档的头部信息,例如文档类型、编码方式等。 3. 逐行写入 XML 元素和属性信息,可以使用 writeStartElement、writeAttribute、writeCharacters 等方法来完成。 4. 使用 XMLStreamWriter 写入 XML 文档的结尾信息,例如结束标签等。 5. 关闭 XMLStreamWriter 对象。 下面是一个简单的例子,演示了如何使用 XMLStreamWriter 将一个简单的 XML 文档输出到标准输出流中: ```java import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamWriter; public class StAXStreamWriterExample { public static void main(String[] args) throws Exception { // 创建输出流和 XMLStreamWriter 对象 OutputStream outputStream = System.out; Writer writer = new OutputStreamWriter(outputStream, "UTF-8"); XMLOutputFactory factory = XMLOutputFactory.newInstance(); XMLStreamWriter xmlWriter = factory.createXMLStreamWriter(writer); // 写入 XML 头部信息和根元素 xmlWriter.writeStartDocument("UTF-8", "1.0"); xmlWriter.writeStartElement("books"); // 写入子元素和属性信息 xmlWriter.writeStartElement("book"); xmlWriter.writeAttribute("id", "1"); xmlWriter.writeStartElement("name"); xmlWriter.writeCharacters("Java Programming"); xmlWriter.writeEndElement(); xmlWriter.writeEndElement(); // 写入根元素的结束标签 xmlWriter.writeEndElement(); // 关闭 XMLStreamWriter 和输出xmlWriter.close(); writer.close(); } } ``` 上面的代码将输出以下 XML 文档: ```xml <?xml version='1.0' encoding='UTF-8'?> <books> <book id="1"> <name>Java Programming</name> </book> </books> ``` 通过使用 XMLStreamWriter,我们可以较为方便地将 XML 文档输出到流中,并且可以按照需要逐行输出元素和属性信息,非常适合处理大型的 XML 数据流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值