Java(Android)解析KML文件

参考自: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

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值