采用dom4j解析下載的xml文件,java程序如下:
package gao.map.preprocess; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 處理從OpenStreetMap下載的原始數據,將抽取的數據輸出為txt文件 * @author Administrator * */ public class OpenStreetMap { //遍歷當前節點下的所有節點 @SuppressWarnings("unchecked") public static void listNodes(Element node){ System.out.println("當前節點的名稱:" + node.getName()); //首先獲取當前節點的所有屬性節點 List<Attribute> list = node.attributes(); //遍歷屬性節點 for(Attribute attribute : list){ System.out.println("屬性"+attribute.getName() +":" + attribute.getValue()); } //如果當前節點內容不為空,則輸出 if(!(node.getTextTrim().equals(""))){ System.out.println( node.getName() + ":" + node.getText()); } //同時迭代當前節點下面的所有子節點 //使用遞歸 Iterator<Element> iterator = node.elementIterator(); while(iterator.hasNext()){ Element e = iterator.next(); listNodes(e); } } @SuppressWarnings("unchecked") public static void main(String[] args) throws IOException, DocumentException { // 點信息 File pointFile = new File("D:\\BaiduYunDownload\\紐約出租數據\\15年1-6黃車-綠車數據\\yellow_tripdata_2015-06.csv\\Point.txt"); // 弧信息 File arcFile = new File("D:\\BaiduYunDownload\\紐約出租數據\\15年1-6黃車-綠車數據\\yellow_tripdata_2015-06.csv\\Arc.txt"); FileOutputStream fosPoint = new FileOutputStream(pointFile); FileOutputStream fosArc = new FileOutputStream(arcFile); OutputStreamWriter oswPoint = new OutputStreamWriter(fosPoint); OutputStreamWriter oswArc = new OutputStreamWriter(fosArc); BufferedWriter bwPoint = new BufferedWriter(oswPoint); BufferedWriter bwArc = new BufferedWriter(oswArc); SAXReader reader = new SAXReader(); // 要讀取的原始地圖數據 String path = "D:\\BaiduYunDownload\\紐約出租數據\\15年1-6黃車-綠車數據\\yellow_tripdata_2015-06.csv\\map"; Document document = reader.read(new File(path)); // 獲取根節點元素對象 osm Element root = document.getRootElement(); // 遍歷osm下的所有子節點 Iterator<Element> iterator = root.elementIterator(); while(iterator.hasNext()){ Element e = iterator.next(); // if(e.getName().equals("node")||e.getName().equals("way")) // listNodes(e); //輸出點信息 if(e.getName().equals("node")){ StringBuilder sb = new StringBuilder(); //首先獲取當前節點的所有屬性節點 List<Attribute> list = e.attributes(); //遍歷屬性節點 for(Attribute attribute : list){ if(attribute.getName().equals("id")) sb.append(attribute.getValue()+" "); if(attribute.getName().equals("lat")) sb.append(attribute.getValue()+" "); if(attribute.getName().equals("lon")) sb.append(attribute.getValue()); } bwPoint.write(sb.toString()+"\r\n"); bwPoint.flush(); System.out.println(sb.toString()); }else if(e.getName().equals("way")){ //輸出弧信息 StringBuilder sb = new StringBuilder(); String s = ""; //首先獲取當前節點的所有屬性節點 List<Attribute> list = e.attributes(); //遍歷屬性節點 for(Attribute attribute : list){ if(attribute.getName().equals("id")) s += attribute.getValue()+" "; if(attribute.getName().equals("version")) s += attribute.getValue()+" "; } //遍歷子節點 Iterator<Element> iter = e.elementIterator(); while(iter.hasNext()){ Element element = iter.next(); //首先獲取當前節點的所有屬性節點 List<Attribute> list1 = element.attributes(); //遍歷屬性節點 for(Attribute attribute : list1){ if(attribute.getName().equals("ref")) sb.append(s + attribute.getValue()+" "+"\r\n"); else if(attribute.getName().equals("k")) sb.append(s + " "+attribute.getValue()+"\r\n"); } } bwArc.write(sb.toString()); bwArc.flush(); System.out.print(sb.toString()); } } bwPoint.close(); oswPoint.close(); fosPoint.close(); bwArc.close(); oswArc.close(); fosArc.close(); System.out.println("輸出完成!"); } }