Java解析rdf和xml文件以及处理excel

一.Java解析rdf文件

1.下载jena库

  • 首先,从这里下载 jena 包 apache-jana-2.7.*.tar.gz(我用的是2.7)。解压。
  • 打开 Eclipse,新建一个Java Project。
  • 右键点击项目->properties->Java Build Path -> libraries。将解压后 lib 目录下的 jar 文件添加到build path 中。
  • OK。现在可以在项目里使用 jena 了。

2.jean中的数据结构

在 Jena 中,资源用 Resource 类来表示,其属性用 Property 类来表示。而整体模型用Model 类来表示。一个 Model 对象可以包含多个资源。每一个资源又包括主语subject、谓语predicate、客体object来表示(下面是一个记录车辆移动数据的rdf文件)。

Java解析rdf和xml文件以及处理excel_第1张图片


其中整个rdf文件可以看做是一个model,每个rdf标签可以看做是一个subject,每个rdf标签下的obs:hasxxx可以看做是predictate,每个xxx中间的xxx看做是object。整个解析类似xml。

3.使用jean

//获取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> list = new ArrayList>();
				list.add(item);
				senderMap.put(sender, list);
			}
			properties.close();
		}
		subjects.close();
		//System.out.println(list);
	}

二.Java解析xml

1.DOM方式

DOM模式解析XML,是把整个XML文档当成一个对象来处理,会先把整个文档读入到内存里。是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。

优缺点:解析简单,但不适合大文件

2.SAX方式

基于事件驱动的方式,适合大文件,非一次性将文件读入内存,主要是要写自己的handler。

/**
	 * 读取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;
	}


 
  




你可能感兴趣的:(Java)