參考自:http://blog.csdn.net/yyywyr/article/details/38359049

http://blog.csdn.net/warrenwyf/article/details/5703279

http://zhidao.baidu.com/question/568729363.html

1 KML文件

现有一个在ARCGIS中生成的点要素shapefile文件,将其转换成kmz文件。可是这个kmz文件并非纯文本的KML服务。而是一个压缩文件,用压缩软件打开这个kmz之后会发现当中包括了一个“doc.kml”和一个“*.png”图标文件。因此。我们须要解析的就是这个doc.kml文件。

其格式例如以下:

<?

xml version="1.0" encoding="UTF-8"?

>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/kml/2.2 http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd http://www.google.com/kml/ext/2.2 http://code.google.com/apis/kml/schema/kml22gx.xsd">
<Document id="4thalter">
<name>4thalter</name>
<Snippet></Snippet>
<Folder id="FeatureLayer0">
<name>4thalter</name>
<Snippet></Snippet>
<Placemark id="ID_00000">
<name>456</name>
<Snippet></Snippet>
<description>
这里是一个HTML文档
</description>
<styleUrl>#IconStyle00</styleUrl>
<Point>
<altitudeMode>clampToGround</altitudeMode>
<coordinates> 119.46,30.96,0</coordinates>
</Point>
</Placemark>
<Placemark id="ID_00002">
<name>457</name>
<Snippet></Snippet>
<description>
这里是一个HTML文档
</description>
<styleUrl>#IconStyle00</styleUrl>
<Point>
<altitudeMode>clampToGround</altitudeMode>
<coordinates> 120.46,30.96,0</coordinates>
</Point>
</Placemark>
<Placemark id="ID_00022">
<name>xc64</name>
<Snippet></Snippet>
<description>
这里是一个HTML文档
</description>
<styleUrl>#IconStyle00</styleUrl>
<Point>
<altitudeMode>clampToGround</altitudeMode>
<coordinates> 118.81,30.93,0</coordinates>
</Point>
</Placemark>
</Folder>
<Style id="IconStyle00">
<IconStyle>
<Icon><href>Layer0_Symbol_11269a08.png</href></Icon>
<scale>0.437500</scale>
</IconStyle>
<LabelStyle>
<color>ff000000</color>
<scale>0.833333</scale>
</LabelStyle>
<PolyStyle>
<color>ff000000</color>
<outline>0</outline>
</PolyStyle>
</Style>
</Document>
</kml>

我们须要解析的属性标签存放在description结点下的HTML中,例如以下:

<![CDATA[<html xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxsl="urn:schemas-microsoft-com:xslt">

<head>

<META http-equiv="Content-Type" content="text/html">

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

</head>

<body style="margin:0px 0px 0px 0px;overflow:auto;background:#FFFFFF;">

<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-collapse:collapse;padding:3px 3px 3px 3px">

<tr style="text-align:center;font-weight:bold;background:#9CBCE2">

<td>第四组</td>

</tr>

<tr>

<td>

<table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px">

<tr>

<td>FID</td>

<td>22</td>

</tr>

<tr bgcolor="#D4E4F3">

<td>soiltype</td>

<td>6</td>

</tr>

<tr>

<td>x</td>

<td>673556</td>

</tr>

<tr bgcolor="#D4E4F3">

<td>y</td>

<td>3424365</td>

</tr>

<tr>

<td>dem</td>

<td>14</td>

</tr>

<tr bgcolor="#D4E4F3">

<td>planc</td>

<td>0</td>

</tr>

<tr>

<td>profc</td>

<td>0</td>

</tr>

<tr bgcolor="#D4E4F3">

<td>slope</td>

<td>0</td>

</tr>

<tr>

<td>PYNAME</td>

<td>第四组</td>

</tr>

<tr bgcolor="#D4E4F3">

<td>ID</td>

<td>664</td>

</tr>

<tr>

<td>name</td>

<td>xc64</td>

</tr>

</table>

</td>

</tr>

</table>

</body>

</html>

]]>

在本案例中。我须要从HTML中提取出坐标x,y和name这三个属性。代码例如以下:

package com.test.parsekml;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;
import android.util.Log; public class ReadKml {
public void parseKml(String pathName) throws Exception
{
File file = new File(pathName);//pathName为KML文件的路径
try {
ZipFile zipFile = new ZipFile(file);
ZipInputStream zipInputStream = null;
InputStream inputStream = null;
ZipEntry entry = null;
zipInputStream = new ZipInputStream(new FileInputStream(file));
while ((entry = zipInputStream.getNextEntry()) != null) {
String zipEntryName = entry.getName();
Log.d("压缩实体的名称:", zipEntryName);
if (zipEntryName.endsWith("kml") || zipEntryName.endsWith("kmz")) {
inputStream = zipFile.getInputStream(entry);
parseXmlWithDom4j(inputStream);
}else if (zipEntryName.endsWith("png")) {
/*ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
byte[] b = new byte[512];
int readedByteSize = 0;
while ((readedByteSize = zipInputStream.read(b)) != -1) {
byteArrayOut.write(b, 0, readedByteSize);
}
byteArrayOut.flush();
byteArrayOut.close();
InputStream isBitmap = new ByteArrayInputStream(byteArrayOut.toByteArray());
Bitmap bitmap = BitmapFactory.decodeStream(isBitmap);
isBitmap.close();*/
}
} zipInputStream.close();
inputStream.close();
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void parseXmlWithDom4j(InputStream input) throws Exception
{
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(input);
} catch (DocumentException e) {
// TODO: handle exception
e.printStackTrace();
}
Element root = document.getRootElement();//获取doc.kml文件的根结点
listNodes(root);
}
//遍历当前节点下的全部节点
public void listNodes(Element node){
Log.d("当前结点的名称:", node.getName());
//首先获取当前节点的全部属性节点
/* List<Attribute> list = node.attributes();
//遍历属性节点
for(Attribute attribute : list){
Log.d("属性", attribute.getName() +":" + attribute.getValue());
} */
//假设当前节点内容不为空,则输出
if(!(node.getTextTrim().equals("")) && "description".equals(node.getName())){
//Log.d("当前结点内容:", node.getText());
parseHtml(node.getText());
}
//同一时候迭代当前节点以下的全部子节点
//使用递归
Iterator<Element> iterator = node.elementIterator();
while(iterator.hasNext()){
Element e = iterator.next();
listNodes(e);
}
}
public void parseHtml(String htmlData)
{
org.jsoup.nodes.Document document = Jsoup.parse(htmlData);
Elements trs = document.select("table").select("tr");
String trContent = "";
String trContentSplit[] = null;
String x = "";
String y = "";
String name = "";
for (int i = 2; i < trs.size(); i++) {//在KML文件里的HTML文本中,共同拥有13个tr,每一个tr包括了一个属性,当中第二个tr包括了全部的属性,因此我们在处理时从第三个tr開始
trContent = trs.get(i).text();
trContentSplit = trContent.split(" ");
if ("name".equals(trContentSplit[0])) {
name = trContentSplit[1]; }
if ("x".equals(trContentSplit[0]) || "X".equals(trContentSplit[0])) {
x = trContentSplit[1].trim();
}
if ("y".equals(trContentSplit[0]) || "Y".equals(trContentSplit[0])) {
y = trContentSplit[1].trim();
} /*Elements tds = elements.get(i).select("td");
for (int j = 0; j < tds.size(); j++) {
htmlContent = tds.get(j).text();
}*/
}
Log.d("X:", x);
Log.d("Y:", y);
Log.d("Name:", name); }
}

本文中使用了dom4j包来解析XML和jsoup包来解析HTML

Java(Android)解析KML文件的更多相关文章

  1. Java jdom解析xml文件带冒号的属性

    Java jdom解析xml文件带冒号的属性 转载请标明出处: https://dujinyang.blog.csdn.net/article/details/99644824 本文出自:[奥特曼超人 ...

  2. JAVA简便解析json文件

    JAVA简便解析json文件 首先放上我要解析的json文件: { "resultcode":"200", "reason":"S ...

  3. 解析KML文件并提取coordinates中的经纬度坐标信息

    从googleEarh导出的kml文件 <?xml version="1.0" encoding="UTF-8"?><kml xmlns=&q ...

  4. android解析xml文件的方式

    android解析xml文件的方式   作者:东子哥 ,发布于2012-11-26,来源:博客园   在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...

  5. Java环境解析apk文件信息

    概述:Java解析apk文件,获取apk文件里的包名,版本号,图标文件等; 功能:可以提供给windows和linux平台使用; 原理:利用aapt.exe或者aapt这些anroid平台解析apk文 ...

  6. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  7. Android解析XML文件

    XML文件和获取XML值 XML文件样例 <?xml version="1.0" encoding="utf-8"?> <citys> ...

  8. java opencsv解析csv文件

    记一次使用opencsv解析csv文件时碰到的坑 最近在开发过程中需要解析csv文件,公司用的解析工具是opencsv,在根据opencsv的官方文档去解析时发现csv文件中含有繁体字,使用其自带的C ...

  9. Android解析xml文件-采用DOM,PULL,SAX三种方法解析

    解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...

随机推荐

  1. Verify Preorder Serialization of a Binary Tree -- LeetCode

    One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, ...

  2. java web定时任务---quartz

    写在前面: 前面有简单的记录下Timer定时的用法,但是在此次项目中,选择的是quartz来完成定时操作任务的.两者都可以完成定时操作,但是spring可以整合quartz,并且配置起来也比较简便,还 ...

  3. iOS开发——给ImageView添加点击事件

          给ImageView添加点击事件   1: cell.pictureView.userInteractionEnabled = YES; 2: UITapGestureRecognizer ...

  4. jvm-监视管理控制台-jconsole

    命令: jconsole 作用: jvm进程运行状态的实时.可视化工具 效果: 连接远程jvm进程: 1.首先远程jvm进程,开启了jmx服务: -Dcom.sun.management.jmxrem ...

  5. Nagle算法&&延时确认

    数据流分类 成块数据 交互数据   Rlogin需要远程系统(服务器)回显我们(客户)键入的字符 数据字节和数据字节的回显都需要对方确认 rlogin 每次只发送一个字节到服务器,而Telnet 可以 ...

  6. RabbitMq_05_Topics

    Topics (using the .NET client) Prerequisites This tutorial assumes RabbitMQ isinstalled and running ...

  7. Linux下使用GDB进行调试

    Linux下使用GDB进行调试的常用命令记于此. $ sudo su # g++ -g test.cpp -o test -pthread # gdb test         <------- ...

  8. javascript快速入门20--Cookie

    Cookie 基础知识 我们已经知道,在 document 对象中有一个 cookie 属性.但是 Cookie 又是什么?“某些 Web 站点在您的硬盘上用很小的文本文件存储了一些信息,这些文件就称 ...

  9. LVS负载均衡之NAT模式部署

    1.LVS的NAT模式介绍 参考自官网:http://www.linuxvirtualserver.org/zh/lvs3.html 由于IPv4中IP地址空间的日益紧张和安全方面的原因,很多网络使用 ...

  10. APK大小的瘦身的总结:

    首先是看了博客:http://blog.csdn.net/sw950729/article/details/64919051 时.认为大神我就是马云飞写的非常有道理.全部自己就自己写了一遍.长话短说: ...