package com.fr.data; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.*; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.XMLEvent; import com.fr.base.Parameter; import com.fr.general.data.DataModel; import com.fr.script.Calculator; import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; import com.fr.config.holder.impl.xml.XmlColConf; /** * XMLDemoTableData * * 这是一个按参数来解析不同地址XML文件的demo * * AbstractParameterTableData 包装了有参数数据集的基本实现 */ public class XMLDemoTableData extends AbstractParameterTableData { // 构造函数 public XMLDemoTableData() { // 定义需要的参数,这里定义一个参数,参数名为filename,给其一个默认值"Northwind.xml" Parameter[] parameters = new Parameter[1]; parameters[0] = new Parameter("filename", "Northwind"); setParameters(parameters); } /** * 返回获取数据的执行对象 * 系统取数时,调用此方法来返回一个获取数据的执行对象 * 注意! 当数据集需要根据不同参数来多次取数时,此方法在一个计算过程中会被多次调用。 */ @SuppressWarnings("unchecked") public DataModel createDataModel(Calculator calculator) { // 获取传进来的参数 ParameterProvider[] params = super.processParameters(calculator); // 根据传进来的参数,等到文件的路径 String filename = null; for (int i = 0; i < params.length; i++) { if (params[i] == null) continue; if ("filename".equals(params[i].getName())) { filename = (String)params[i].getValue(); } } String filePath; if (StringUtils.isBlank(filename)) { filePath = "/Users/susie/Downloads/DefaultFile.xml"; } else { filePath = "/Users/susie/Downloads/" + filename + ".xml"; } // 定义需要解析的数据列,机器 // XMLColumnNameType4Demo[] columns = new XMLColumnNameType4Demo[7]; // columns[0] = new XMLColumnNameType4Demo("CustomerID", XMLParseDemoDataModel.COLUMN_TYPE_STRING); // columns[1] = new XMLColumnNameType4Demo("CompanyName", XMLParseDemoDataModel.COLUMN_TYPE_STRING); // columns[2] = new XMLColumnNameType4Demo("ContactName", XMLParseDemoDataModel.COLUMN_TYPE_STRING); // columns[3] = new XMLColumnNameType4Demo("ContactTitle", XMLParseDemoDataModel.COLUMN_TYPE_STRING); // columns[4] = new XMLColumnNameType4Demo("Address", XMLParseDemoDataModel.COLUMN_TYPE_STRING); // columns[5] = new XMLColumnNameType4Demo("City", XMLParseDemoDataModel.COLUMN_TYPE_STRING); // columns[6] = new XMLColumnNameType4Demo("Phone", XMLParseDemoDataModel.COLUMN_TYPE_STRING); List list=new ArrayList(); XMLInputFactory inputFactory = XMLInputFactory.newInstance(); InputStream in; try { in = new BufferedInputStream(new FileInputStream(new File(filePath))); XMLEventReader reader = inputFactory.createXMLEventReader(in); deep=0; flag=false; readCol(reader,list); in.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } XMLColumnNameType4Demo[] columns=(XMLColumnNameType4Demo[])list.toArray(new XMLColumnNameType4Demo[0]); // 定义解析的数据在xml文件结构中的位置 String[] xpath = new String[2]; xpath[0] = "Northwind"; xpath[1] = "Customers"; /* * 说明 * 提供的样例xml文件的格式是: * * * ALFKI * Alfreds Futterkiste * Maria Anders * Sales Representative *
Obere Str. 57
* Berlin * 12209 * Germany * 030-0074321 * 030-0076545 *
* * * 上面定义的意义就是 * /Northwind/Customers路径所表示的一个Customers节点为一条数据,它包含的节点中的CustomerID...等等是需要获取的列值 */ // 构造一个实际去取值的执行对象 return new XMLParseDemoDataModel(filePath, xpath, columns); } private int deep=0; private static final int COL_DEEP=3; private boolean flag=false; private void readCol(XMLEventReader reader,List list) throws XMLStreamException { while (reader.hasNext()) { XMLEvent event = reader.nextEvent(); if (event.isStartElement()) { //deep是控制层数的,只把xml中对应的层的加入到列名中 deep++; //表示已经进入到了列名那一层 if(deep==COL_DEEP){ flag=true; } //如果在高层,并且已经进入到了col层,则退出 if(deep