forked from demo/example
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
7.9 KiB
200 lines
7.9 KiB
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文件的格式是: |
|
* <Notrhwind> |
|
* <Customers> |
|
* <CustomerID>ALFKI</CustomerID> |
|
* <CompanyName>Alfreds Futterkiste</CompanyName> |
|
* <ContactName>Maria Anders</ContactName> |
|
* <ContactTitle>Sales Representative</ContactTitle> |
|
* <Address>Obere Str. 57</Address> |
|
* <City>Berlin</City> |
|
* <PostalCode>12209</PostalCode> |
|
* <Country>Germany</Country> |
|
* <Phone>030-0074321</Phone> |
|
* <Fax>030-0076545</Fax> |
|
* </Customers> |
|
* </Northwind> |
|
* |
|
* 上面定义的意义就是 |
|
* /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<COL_DEEP&&flag){ |
|
return; |
|
} |
|
if(deep!=COL_DEEP){ |
|
continue; |
|
} |
|
// println("name: " + event.asStartElement().getName()); |
|
XMLColumnNameType4Demo column=new XMLColumnNameType4Demo(event.asStartElement().getName().toString(), XMLParseDemoDataModel.COLUMN_TYPE_STRING); |
|
list.add(column); |
|
readCol(reader,list); |
|
} else if (event.isCharacters()) { |
|
//对数据值不做处理 |
|
} else if (event.isEndElement()) { |
|
deep--; |
|
return; |
|
} |
|
} |
|
} |
|
|
|
private void readCol0(XMLEventReader reader) |
|
throws XMLStreamException { |
|
while (reader.hasNext()) { |
|
XMLEvent event = reader.nextEvent(); |
|
if (event.isStartElement()) { |
|
//deep是控制层数的,只把xml中对应的层的加入到列名中 |
|
deep++; |
|
//表示已经进入到了列名那一层 |
|
if(deep==COL_DEEP){ |
|
flag=true; |
|
} |
|
//如果在高层,并且已经进入到了col层,则退出 |
|
if(deep<COL_DEEP&&flag){ |
|
return; |
|
} |
|
if(deep!=COL_DEEP){ |
|
continue; |
|
} |
|
System.out.println("name: " + event.asStartElement().getName()); |
|
readCol0(reader); |
|
} else if (event.isCharacters()) { |
|
//对数据值不做处理 |
|
} else if (event.isEndElement()) { |
|
deep--; |
|
return; |
|
} |
|
} |
|
} |
|
public static void main(String[] args){ |
|
XMLInputFactory inputFactory = XMLInputFactory.newInstance(); |
|
// in = new FileReader(new File(filePath)); |
|
// XMLEventReader reader = inputFactory.createXMLEventReader(in); |
|
// readCol(reader,list); |
|
BufferedInputStream in; |
|
try { |
|
in = new BufferedInputStream(new FileInputStream(new File("/Users/susie/Downloads/f.xml"))); |
|
byte[] ba=new byte[3]; |
|
in.read(ba,0,3); |
|
// System.out.println(in) |
|
XMLEventReader reader = inputFactory.createXMLEventReader(in); |
|
new XMLDemoTableData().readCol0(reader); |
|
} catch (Exception e) { |
|
// TODO Auto-generated catch block |
|
e.printStackTrace(); |
|
} |
|
} |
|
}
|
|
|