在 Jena 中,资源用 Resource 类来表示,其属性用 Property 类来表示。而整体模型用Model 类来表示。一个 Model 对象可以包含多个资源。每一个资源又包括主语subject、谓语predicate、客体object来表示(下面是一个记录车辆移动数据的rdf文件)。
其中整个rdf文件可以看做是一个model,每个rdf标签可以看做是一个subject,每个rdf标签下的obs:hasxxx可以看做是predictate,每个
//获取model
public static Model readRDF(String fileName) {
Model model = ModelFactory.createDefaultModel();
InputStream in = FileManager.get().open(fileName);
if (in == null) {
throw new IllegalArgumentException("File: " + fileName
+ " not found");
}
// 读取RDF/XML 文件
return model.read(in, com.hp.hpl.jena.vocabulary.RDF.getURI(), "RDF/XML-ABBREV");
// model.write(System.out);
}
/**
* 获取经纬度以及发送者ID
* @param model 数据
* @param list 存储结果
*/
public static void getWantedItems(Model model,
Map>> senderMap, HashSet nameSet) {
ResIterator subjects = model.listSubjects();
while (subjects.hasNext()) {
Resource subject = subjects.next();
//Property property = model.createProperty();
//System.out.println(subject.getLocalName());
StmtIterator properties = subject.listProperties();
Map item = new HashMap();
String sender = null;
while (properties.hasNext()) {
Statement stmt = properties.nextStatement();
Property predicate = stmt.getPredicate();
RDFNode object = stmt.getObject();
String val = null;
String name = predicate.getLocalName().trim();
//System.out.println(name);
val = object.toString().split("\\^\\^")[0];
if (name.equals("hasLongitude")) {
item.put("longitude", val);
} else if (name.equals("hasLatitude")) {
item.put("latitude", val);
} else if (name.equals("hasSender")) {
sender = val.trim();
item.put("sender", val);
nameSet.add(sender);
}
//System.out.println();
}
if (senderMap.get(sender)!=null) {
senderMap.get(sender).add(item);
}else {
System.out.println("新车id:"+sender+"创建list成功");
List
DOM模式解析XML,是把整个XML文档当成一个对象来处理,会先把整个文档读入到内存里。是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。
优缺点:解析简单,但不适合大文件
/**
* 读取xml文件,使用SAXParser解析
*
* @param uri
* @param NodeName
* @return
*/
public static List> ReadXML(String uri, String NodeName) {
try {
// 创建一个解析XML的工厂对象
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
// 创建一个解析XML的对象
SAXParser parser = parserFactory.newSAXParser();
// 创建一个解析助手类
Myhandler myhandler = new Myhandler("Observation");
parser.parse(uri, myhandler);
return myhandler.getList();
} catch (Exception e) {
e.printStackTrace();
} finally {
}
return null;
}
/**
* 将list容器里的内容写入到新的xml文件
*
* @param vanet
*/
public static void createXML(List> vanet) {
try {
// 创建工厂
SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory
.newInstance();
TransformerHandler handler = factory.newTransformerHandler();
Transformer info = handler.getTransformer();
// 是否自动添加额外的空白
info.setOutputProperty(OutputKeys.INDENT, "yes");
// 设置字符编码
info.setOutputProperty(OutputKeys.ENCODING, "utf-8");
info.setOutputProperty(OutputKeys.VERSION, "1.0");
info.setOutputProperty(OutputKeys.STANDALONE, "no");
// 保存创建的saxvanet.xml
StreamResult result = new StreamResult(new FileOutputStream(
"f:\\xml\\map2.gpx"));
handler.setResult(result);
// 开始xml
handler.startDocument();
AttributesImpl impl = new AttributesImpl();
impl.clear();
addAttr(impl);
handler.startElement("", "", "gpx", impl);
for (int i = 0; i < vanet.size(); i++) {
/*
*
* 123
* 矿1
* test
* unistrong:104
*
*/
Map map = vanet.get(i);
Vehicle vh = setVehicle(map);
// 生成
impl.clear(); // 清空属性
impl.addAttribute("", "", "lat", "", vh.getLatitude());
impl.addAttribute("", "", "lon", "", vh.getLongitude());
handler.startElement("", "", "wpt", impl);
// 生成xx 元素
impl.clear();
handler.startElement("", "", "name", impl);
String name = vh.getSender();
//System.out.println("name:"+name);
handler.characters(name.toCharArray(), 0, name.length()); // 为name元素添加文本
handler.endElement("", "", "name");
impl.clear();
handler.endElement("", "", "wpt");
}
// 生成
handler.endElement("", "", "gpx");
handler.endDocument();
System.out.println("complete.................................................");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void addAttr(AttributesImpl impl) {
impl.addAttribute("", "", "xmlns", "",
"http://www.topografix.com/GPX/1/1");
impl.addAttribute("", "", "creator", "", "MapSource 6.5");
impl.addAttribute("", "", "version", "", "1.1");
impl.addAttribute("", "", "xmlns:xsi", "",
"http://www.w3.org/2001/XMLSchema-instance");
impl.addAttribute("", "", "xsi:schemaLocation", "",
"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd");
System.out.println("添加属性成功");
}
public class Myhandler extends DefaultHandler {
//
private HashSet set = null;
// 存储正在解析的元素的数据
private Map map = null;
// 存储所有解析的元素的数据
private List> list = null;
// 正在解析的元素的名字
String currentTag = null;
// 正在解析的元素的元素值
String currentValue = null;
// 开始解析的元素
String nodeName = null;
public Myhandler(String nodeName) {
// TODO Auto-generated constructor stub
this.nodeName = nodeName;
}
public HashSet getSet() {
return set;
}
public List> getList() {
return list;
}
/*
*
* 90268
* 60 169
* 0 134569370
*/
// 开始解析文档,即开始解析XML根元素时调用该方法
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("--startDocument()--");
// 初始化Map
//list = new ArrayList>();
set = new HashSet();
}
// 开始解析每个元素时都会调用该方法
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
// 判断正在解析的元素是不是开始解析的元素
currentTag = null;
//System.out.println("--startElement()--" + qName);
if (qName.equals(nodeName)) {
//map = new HashMap();
return;
}
/*if (qName.equals("Time") || qName.equals("Area")
|| qName.equals("Velocity") || qName.equals("Direction")||qName.equals("ManualInfo")) {
return;
}*/
if (qName.equals("Sender")) {
//System.out.println("sender");
// 判断正在解析的元素是否有属性值,如果有则将其全部取出并保存到map对象中,如:
/*if (attributes != null && map != null) {
for (int i = 0; i < attributes.getLength(); i++) {
//map.put(attributes.getQName(i), attributes.getValue(i));
//set.add(e)
}
}*/
currentTag = qName; // 正在解析的元素
}else {
return ;
}
}
// 解析到每个元素的内容时会调用此方法
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
//System.out.println("--characters()--");&& map != null
if (currentTag != null) {
currentValue = new String(ch, start, length);
// 如果内容不为空和空格,也不是换行符则将该元素名和值和存入map中
if (currentValue != null && !currentValue.trim().equals("")
&& !currentValue.trim().equals("\n")) {
//map.put(currentTag, currentValue);
set.add(currentValue);
System.out.println(currentTag + ": " + currentValue);
}
// 当前的元素已解析过,将其置空用于下一个元素的解析
currentTag = null;
currentValue = null;
}
}
// 每个元素结束的时候都会调用该方法
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
//System.out.println("--endElement()--" + qName);
// 判断是否为一个节点结束的元素标签
/*if (qName.equals(nodeName)) {
list.add(map);
map = null;
}*/
}
// 结束解析文档,即解析根元素结束标签时调用该方法
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("--endDocument()--");
super.endDocument();
}
}
三.解析excel
使用jxl库,其使用还是比较简单的(代码可能不能直接用, 里面有些entity类需要自己建,有些list也需要自己处理)。
public class WriteToExcelUtils {
private static final int MAXROWS = 60000;
private static int INDEX = 0;
public static void writeExcel(String fileName,
List> list, String excel) {
String excelName = excel;
String sheetName = list.get(0).get("dateTime");
//System.out.println("表名:"+sheetName);
int startLine = 0;
int rows = list.size();
Workbook wb = null;
WritableWorkbook wwb = null;
boolean flag = false;
try {
File is = new File(fileName+"\\"+excelName+".xls");
if (!is.exists()) {
System.out.println("新的excel:"+excelName+".xls");
wwb = Workbook.createWorkbook(is);
flag = true;
} else {
wb = Workbook.getWorkbook(is);
Sheet sheet = wb.getSheet(sheetName);
if (sheet!=null) {
// 获取行
int length = sheet.getRows();
startLine = length;
}else {
//System.out.println(sheetName+"不存在");
flag = true;
}
// 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象
// wwb = Workbook.createWorkbook(new File(fileName));
wwb = Workbook.createWorkbook(is, wb);
}
} catch (Exception e) {
e.printStackTrace();
}
if (wwb != null) {
// 创建一个可写入的工作表
// Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置
// System.out.println(index);
WritableSheet ws = null;
if (flag) {
System.out.println("创建新的sheet: "+sheetName);
ws = wwb.createSheet(sheetName, 0);
} else{
//System.out.println(sheetName);
ws = wwb.getSheet(0);
}
// 下面开始添加单元格
for (int i = 0; i < rows; i++) {
Vehicle vh = SaxService.setVehicle(list.get(i));
String dte = vh.getDate();
String longitude = vh.getLongitude();
String latitude = vh.getLatitude();
List items = new ArrayList();
items.add(dte);
items.add(longitude);
items.add(latitude);
for (int j = 0; j < 3; j++) {
write2Cell(ws, j, i + startLine, items.get(j));
}
}
//index += rows;
try {
// 从内存中写入文件中
wwb.write();
// 关闭资源,释放内存
wwb.close();
} catch (IOException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
}
public static void write2Cell(WritableSheet ws, int c, int r, String item) {
// System.out.println(index+r);
// 这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行
Label labelC = new Label(c, r, item);
try {
// 将生成的单元格添加到工作表中
ws.addCell(labelC);
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
/**
* 读Excel
*
* @param pathname
*/
public static LinkedList> readExcel(String pathname) {
LinkedList> list = new LinkedList>();
File file = new File(pathname);
String uri = "f:\\xml\\map\\edge.xml";
Workbook wb = null;
try {
wb = Workbook.getWorkbook(file);
Sheet sheet = wb.getSheet(0);
int rows = sheet.getRows();
// ThreadPoolExecutorTest threadPool = new
// ThreadPoolExecutorTest(queue);
for (int i = 0; i < rows; i++) {
HashMap map = new HashMap();
// System.out.println("第"+(i+1)+"条数据正在执行");
Cell[] cols = sheet.getRow(i);
String sender = cols[0].getContents();
String nodeID = cols[1].getContents();
String wayID = cols[2].getContents();
String depart = cols[3].getContents();
String edgeID = SaxService.getWayIdFromNodeXML(uri, nodeID, wayID);
map.put("sender", sender);
map.put("nodeID", nodeID);
map.put("wayID", wayID);
map.put("edgeID", edgeID);
map.put("depart", depart);
list.add(map);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}