用java解析在OpenStreetMap上下载的地图数据(SAX版,适合比较大的xml文件)
java程序如下:
package gao.map.preprocess; import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.Attributes;
import org.xml.sax.SAXException; /**
* 处理从OpenStreetMap下载的原始数据,将抽取的数据输出为text文件
* @author Administrator
*
*/
public class OpenStreetMap {
static String s = null;
//实现自己的解析方式
static class MySAXHandler extends DefaultHandler { FileOutputStream fosPoint;
FileOutputStream fosArc;
OutputStreamWriter oswPoint;
OutputStreamWriter oswArc;
BufferedWriter bwPoint;
BufferedWriter bwArc;
//开始解析时调用
public void startDocument() throws SAXException {
// 点信息
File pointFile = new File("D:\\项目\\mongo\\MapPre\\Point.txt");
// 弧信息
File arcFile = new File("D:\\项目\\mongo\\MapPre\\Arc.txt");
try {
fosPoint = new FileOutputStream(pointFile);
fosArc = new FileOutputStream(arcFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
oswPoint = new OutputStreamWriter(fosPoint);
oswArc = new OutputStreamWriter(fosArc);
bwPoint = new BufferedWriter(oswPoint);
bwArc = new BufferedWriter(oswArc);
System.out.println("开始解析文档!");
} //完成解析时调用
public void endDocument() throws SAXException {
try {
bwPoint.close();
oswPoint.close();
fosPoint.close();
bwArc.close();
oswArc.close();
fosArc.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("文档解析完成!");
} /**
* 开始一个元素的解析
* @param uri
* @param localName
* @param qName 标签名
* @param attributes 属性
* @throws SAXException
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ((attributes != null)&&attributes.getLength() > 0) {
if(qName.equals("node")){
StringBuilder sb = new StringBuilder();
sb.append(attributes.getValue("id")+" ");
sb.append(attributes.getValue("lat")+" ");
sb.append(attributes.getValue("lon"));
try {
bwPoint.write(sb.toString()+"\r\n");
bwPoint.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(sb.toString());
}else if(qName.equals("way")){
s = attributes.getValue("id")+" "
+attributes.getValue("version")+" ";
}else if(qName.equals("nd")){
if(s==null)
return;
try {
bwArc.write(s+attributes.getValue("ref")+" \r\n");
bwArc.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(s+attributes.getValue("ref")+" ");
}else if(qName.equals("tag")){
if(s==null)
return;
try {
bwArc.write(s+" "+attributes.getValue("k")+"\r\n");
bwArc.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(s+" "+attributes.getValue("k"));
}else if(qName.equals("relation")){
if(s!=null)
s = null;
}
}
} /**
* 结束一个元素的解析,遇到结束标签时调用此方法 通常在此方法对标签取值并处理
* @param uri
* @param localName
* @param qName
* @throws SAXException
*/
public void endElement(String uri, String localName, String qName)
throws SAXException { } //该方法是获得元素间的text文本内容,可以通过new String(ch, start, length)来获得
public void characters(char[] ch, int start, int length)
throws SAXException {
// System.out.print(new String(ch, start, length));
}
} public static void main(String[] args) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
try {
SAXParser saxparser = saxfac.newSAXParser();
InputStream is = new FileInputStream("D:\\项目\\map");
MySAXHandler handler = new MySAXHandler();
saxparser.parse(is, handler);;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
参考链接:
四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
快速有效的解析大型XML文件
详解Java解析XML的四种方法—DOM/SAX/jdom/dom4j
用java解析在OpenStreetMap上下载的地图数据(SAX版,适合比较大的xml文件)的更多相关文章
- 用java解析在OpenStreetMap上下载的地图数据
采用dom4j解析下载的xml文件,java程序如下: package gao.map.preprocess; import java.io.BufferedWriter; import java.i ...
- java web 通过前台输入的数据(name-value)保存到后台 xml文件中
一:项目需求,前端有一个页面,页面中可以手动输入一些参数数据,通过点击前端的按钮,使输入的数据保存到后台生成的.xml文件中 二:我在前端使用的是easyui的propertygrid,这个能通过da ...
- java模拟从http上下载文件
1.依赖 Apache httpclient 包. 2.代码 HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = ...
- Java XML文件解析
四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 蓝色字体内容由上一篇博文中补充进来的,写作风格比较好,大家有兴趣可以去查看原文 众所周知,现在解析XML的方法越来越多,但主流的方法也就四 ...
- java解析xml的4种经典方法
========================================== xml文件 <?xml version="1.0" encoding="GB2 ...
- JAVA解析XML的四种方式
java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...
- java解析xml文件四种方式
1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 ...
- 高性能Java解析器实现过程详解
如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...
- java解析xml字符串方法
一,用DOM4J 针对无重复标签的xml字符串格式,如下: 针对此种情况可用DOM4J解析法,引入 dom4j的相关jar包代码如下: Document document=DocumentHelpe ...
随机推荐
- 转:springboot(二):web综合开发
web开发 spring boot web开发非常的简单,其中包括常用的json输出.filters.property.log等 json 接口开发 在以前的spring 开发的时候需要我们提供jso ...
- Tomcat基于MSM+Memcached实现Session共享
简述 上一篇文章,分别演示了session sticky 和 session cluster来实现会话保持的问题,但是它们缺点都不少,实际中用的很少,所以这篇文章我们还是通过Tomcat来演示一下实际 ...
- ORACLE TO_CHAR(SYSDATE,'D')
DDD是该天在一年内的第多少天,d是在一周内第几天,dd是一个月内的 DY :Day of week abbreviated Mon, Tue, Fri DAY :Day of week spelle ...
- HTTP协议--请求与响应
1.简介 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990 年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW 中使用的是HT ...
- 网络请求+Gson解析--Retrofit 2
其实内部是封装了Okhttp和Gson解析 public class CourseFragmentAPI { public static void get(String userId, BaseCal ...
- 基于五阶段流水线的RISC-V CPU模拟器实现
RISC-V是源自Berkeley的开源体系结构和指令集标准.这个模拟器实现的是RISC-V Specification 2.2中所规定RV64I指令集,基于标准的五阶段流水线,并且实现了分支预测模块 ...
- 美团外卖iOS多端复用的推动、支撑与思考
背景 美团外卖2013年11月开始起步,随后高速发展,不断刷新多项行业记录.截止至2018年5月19日,日订单量峰值已超过2000万,是全球规模最大的外卖平台.业务的快速发展对技术支撑提出了更高的要求 ...
- cloudstack模板
玩cloudstack的人都应该玩过模板这个功能,这里还是比较有意思的,我们底层连接vcenter 创建vm采用模板 实际这里的磁盘方案,并不是给系统重新分配的磁盘大小而是又新挂上了一块磁盘,新磁盘的 ...
- centOS7.4服务器 yum安装 搭建lamp环境
// 红色加粗是linux命令 安装gcc和gcc-c++ yum -y install gcc gcc-c++ yum list httpd* 安装apche yum -y install http ...
- 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)
题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...