packagecom.fr.data;
importjava.io.File;
importjava.util.ArrayList;
importjava.util.List;
importjavax.xml.parsers.SAXParser;
importjavax.xml.parsers.SAXParserFactory;
importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;
importcom.fr.base.FRContext;
importcom.fr.data.AbstractDataModel;
importcom.fr.general.ComparatorUtils;
importcom.fr.general.data.TableDataException;
/**
* XMLParseDemoDataModel
*
* DataModel是获取数据的接口
*
* 这里通过init方法一次性取数后,构造一个二维表对象来实现DataModel的各个取数方法
*/
publicclass XMLParseDemoDataModel
extends
AbstractDataModel {
public
static
final
int
COLUMN_TYPE_STRING=
0
;
public
static
final
int
COLUMN_TYPE_INTEGER=
1
;
public
static
final
int
COLUMN_TYPE_BOOLEAN=
2
;
protected
List row_list =
null
;
private
String[] xPath;
private
XMLColumnNameType4Demo[]columns;
private
String filePath;
public
XMLParseDemoDataModel(Stringfilename, String[] xPath,
XMLColumnNameType4Demo[] columns){
this
.filePath = filename;
this
.xPath = xPath;
this
.columns = columns;
}
/**
* 取出列的数量
*/
public
int
getColumnCount() throwsTableDataException {
return
columns.length;
}
/**
* 取出相应的列的名称
*/
public
String getColumnName(intcolumnIndex)
throws
TableDataException {
if
(columnIndex <
0
|| columnIndex>= columns.length)
return
null
;
String columnName =columns[columnIndex] ==
null
?
null
:columns[columnIndex].getName();
return
columnName;
}
/**
* 取出得到的结果集的总的行数
*/
public
int
getRowCount() throwsTableDataException {
this
.init();
return
row_list.size();
}
/**
* 取出相应位置的值
*/
public
Object getValueAt(
int
rowIndex, intcolumnIndex)
throws
TableDataException {
this
.init();
if
(rowIndex <
0
|| rowIndex >=row_list.size() || columnIndex <
0
|| columnIndex >=columns.length)
return
null
;
return
((Object[])row_list.get(rowIndex))[columnIndex];
}
/**
* 释放一些资源,取数结束后,调用此方法来释放资源
*/
public
void
release()
throws
Exception{
if
(
this
.row_list !=
null
) {
this
.row_list.clear();
this
.row_list =
null
;
}
}
/**************************************************** */
/** ***********以上是实现DataModel的方法*************** */
/**************************************************** */
/**************************************************** */
/** ************以下为解析XML文件的方法*****************/
/**************************************************** */
protected
void
init() throwsTableDataException {
if
(
this
.row_list !=
null
)
return
;
this
.row_list =
new
ArrayList();
try
{
SAXParserFactory f =SAXParserFactory.newInstance();
SAXParser parser =f.newSAXParser();
parser.parse(newFile(XMLParseDemoDataModel.
this
.filePath),
new
DemoHandler());
}
catch
(Exception e) {
e.printStackTrace();
FRContext.getLogger().error(e.getMessage(), e);
}
}
/**
* 基本原理就是解析器在遍历文件时发现节点开始标记时,调用startElement方法读取节点内部内容时,调用characters方法
* 发现节点结束标记时,调用endElement
*/
private
class
DemoHandler extendsDefaultHandler {
private
List levelList = newArrayList();
private
Object[] values;
private
int
recordIndex = -
1
;
public
void
startElement(String uri,String localName, String qName,
Attributes attributes) throwsSAXException {
levelList.add(qName);
if
(isRecordWrapTag()) {
values = newObject[XMLParseDemoDataModel.
this
.columns.length];
}
else
if
(needReadRecord()) {
recordIndex =getColumnIndex(qName);
}
}
public
void
characters(
char
[] ch, intstart,
int
length)
throws
SAXException {
if
(recordIndex > -
1
) {
String text =
new
String(ch,start, length);
XMLColumnNameType4Demo type =XMLParseDemoDataModel.
this
.columns[recordIndex];
Object value =
null
;
if
(type.getType() ==COLUMN_TYPE_STRING) {
value = text;
}
if
(type.getType() ==COLUMN_TYPE_INTEGER) {
value = newInteger(text);
}
else
if
(type.getType() ==COLUMN_TYPE_BOOLEAN) {
value = newBoolean(text);
}
values[recordIndex] = value;
}
}
public
void
endElement(String uri,String localName, String qName)
throws
SAXException {
try
{
if
(isRecordWrapTag()) {
XMLParseDemoDataModel.
this
.row_list.add(values);
values =
null
;
}
else
if
(needReadRecord()){
recordIndex = -
1
;
}
}
finally
{
levelList.remove(levelList.size() -
1
);
}
}
private
boolean
isRecordWrapTag(){
if
(levelList.size() ==XMLParseDemoDataModel.
this
.xPath.length
&& compareXPath()){
return
true
;
}
return
false
;
}
private
boolean
needReadRecord() {
if
(levelList.size() ==(XMLParseDemoDataModel.
this
.xPath.length +
1
)
&& compareXPath()){
return
true
;
}
return
false
;
}
private
boolean
compareXPath() {
String[] xPath =XMLParseDemoDataModel.
this
.xPath;
for
(
int
i =
0
; i <xPath.length; i++) {
if
(!ComparatorUtils.equals(xPath[i], levelList.get(i))) {
return
false
;
}
}
return
true
;
}
private
int
getColumnIndex(StringcolumnName) {
XMLColumnNameType4Demo[] nts =XMLParseDemoDataModel.
this
.columns;
for
(
int
i =
0
; i < nts.length;i++) {
if
(ComparatorUtils.equals(nts[i].getName(), columnName)) {
return
i;
}
}
return
-
1
;
}
}
}