`
aidxn527
  • 浏览: 43366 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类

OpenLayer中的XML解析器,必须理解地

    博客分类:
  • GIS
阅读更多

开源WebGIS中用Java程序语言进行快速开发是最经常使用的方法。比较普遍的是用OpenLayers技术+GeoTools技术+Geoserver服务器+MySQL数据库(当然也可以是DB2等等。由于要收费,所以我会使用PostSQL/GIS数据库)。

 

当然,我总是希望找到更为简单的解决问题的途径,最好不牵扯那么多乱七八糟的技术,因此,于比小型Web
GIS项目来说,有个方法可以让我们摆脱GeoTools技术为我们提供的那1000多个API所带来的痛苦。

 

对于初级Java程序员来说,可以直接用Openlayers+JAXP等几个基本类包来完成工作。然后,把程序运行在Geoserver服务上。你可以用Hibanite来实现数据持久化(因此,它有时会阻碍我的生产率,因此,在大型的项目里面我才用。如果你用在小型项目里面时发现了它的缺点,可以通过其他技术来避免这部分的损失。你必须v头脑灵光,不要为框架而框架,应该是通过合适的技术来提高自己的工作生产率),以便与MySQL数据库通信(MySQL数据库虽然已支持Geometry数据,但是也比较糟糕)。

 

每个技术的任务是什么:

 

1、OpenLayers只监听电子地图上的用户请求(电子地图操作很多情况加都要采用Ajax异步交互技术),取出业务需要的数据,并将数据变成一个 XML对象(或者是GML/GEoRSS/KML什么的都行)传到Java程序里后任务就结束了(也有不转换成XML的方法,这里不作为重点);

 

2、Java中我们使用JAXP和STCAME等类包、方法来解析刚才的XML对象,进行业务处理,加工数据,存放数据(如果不用XML数据格式,就可以不用以上两个类包和方方,这里不作重点);

 

3、当然Geoserver在整个过程中都是枢纽,他分析用户请求和服务器响应。(当然如果你有时间和兴趣也可以扩展开源Geoserver,我是有心而没时间);

 

以上不是我叙述的重点,因此不在废话!在数据传输中XML是经常用,同时也是很关键的传送格式,因此我从OpenLayers官方网站上找了个例子,结合自己经验和体会具体说明一些OL技术中提供的XML类,以便大家我们能更好的应用GML、GeoRESS、KML等数据格式。

 

以下是源代码,应该拷贝到本地就可以用,我是在Geoserver中运行地,如果感觉不爽可以登录http://www.openlayers.org/dev/examples/xml.html

 

<!--引入OpenLayers错误控制器,如果你也有这个文件就把他加载进来,在界面上按F12就能看见了。如果没有就去掉这个行,Firebug是一个比较简单的报错控件,类似于初级Eclipse
Debug控制台-->
<br>
<br>
<script src="http://www.openlayers.org/dev/lib/Firebug/firebug.js" type="text/javascript"></script>
<br><br>
<!--引入OpenLayers.js,必须地--><br>
<script src="http://www.openlayers.org/dev/lib/OpenLayers.js" type="text/javascript"></script>
<br><br><br>
<script type="text/javascript"><br/>
//声明OpenLayers.Format.XML()对象实例,XML()是Format类的其中一个子类,Fromat类中还包括GML、GeoRSS、KML的其他的数据格式。  
var format = new OpenLayers.Format.XML();
//空变量       
var doc = null;
//自动加载的函数     
function init() {
//被解析的xml文件,一般这个文件是我们用程序写出来的动态文件,除了数据结构不变以外,里面的标记详细值都是动态的,同时又一个标签用来存放几何数据。         
var url = "xml/features.xml";
 
OpenLayers.loadURL(url, null, null, loadSuccess,
loadFailure);      
}

//服务器端成功响应了loadURL()中xml/features.xml文件后,所执行的函数      
function loadSuccess(request) {
    //加载完毕后,调用updateStatus(msg)方法,将ID为"loadStatus"的HTML对象中的,第一个标注内的详细值赋为"XML文件加载完毕,请进行试验!"文本字符串      
    updateStatus("XML文件加载完毕,请进行试验!");     
    //如果返回的request对象的元素不是XML对象类型,则按Text对象处理返回类型,并赋值给变量doc
    if(!request.responseXML.documentElement) {          
    doc = format.read(request.responseText);         
} else {
    //否则就按XML对象处理返回类型并赋值给变量doc            
    doc = request.responseXML;       
}
       
}
//服务器端响应了loadURL()中xml/features.xml文件失败后,所执行的函数       
function loadFailure(request) {
    //加载失败后,调用updateStatus(msg)方法,将ID为"loadStatus"的HTML对象中的,第一个标注内的详细值赋为"XML文件加载失败,请查看文件是否存在或者是URL地址!"文本字符串
    updateStatus("XML文件加载失败,请查看文件是否存在或者是URL地址!");      
}

     
function updateStatus(msg) {           
    //将ID为"loadStatus"的HTML对象中的,第一个标注内的详细值赋为msg文本字符串变量
    document.getElementById("loadStatus").firstChild.nodeValue = msg;   
}

//今天就写到这里吧,累了...       
function updateOutput(text) {
    document.getElementById("output").firstChild.nodeValue =text;      
}
       
function write() {          
    var text = format.write(doc);       
    updateOutput(text);       
}
       
function getElementsByTagNameNS(node, uri, name) {          
    var nodes = format.getElementsByTagNameNS(node, uri, name);         
    var pieces = [];          
    for(var i=0; i<nodes.length; ++i) {           
        pieces.push(format.write(nodes[i]));     
    }          
    updateOutput(pieces.join(' '));      
}

       
function hasAttributeNS(node, uri, name) {          
    updateOutput(format.hasAttributeNS(node, uri, name))      
}
       
function getAttributeNodeNS(node, uri, name) {          
    var attributeNode = format.getAttributeNodeNS(node, uri,name);           
    updateOutput(attributeNode.nodeName + ' = "' + attributeNode.nodeValue + '"');      
}
       
function getAttributeNS(node, uri, name) {          
    var attributeValue = format.getAttributeNS(node, uri, name);          
    updateOutput('"' + attributeValue + '"')      
}
       
function createElementNS(uri, name) {          
    var node = format.createElementNS(uri, name);          
    doc.documentElement.appendChild(node);           
    write();      
}
       
function createTextNode(text) {          
    var node = format.createTextNode(text);          
    doc.documentElement.appendChild(node);         
    write();      
}
     
window.onload = init;
     
</script>
<p>OpenLayers有一个很简单的XML类,你可以用var name = new
OpenLayers.Format.XML();方式来声明。这个类包含可以读取,输出".xml"文件,并允许被实例的对象使用类的方法和属性。</p>
<p>这个XML类可以让我们从矢量电子地图(由于我把在电子地图上画的Point、Line、Ploygon等Feature对象放在 Vector层上,或者是经常用Vector型的地图数据来呈图,因此我就这么理解了这句英文,哈哈!)上通过DOM解析器来提取、者输出各种XML格式的数据。但是,千万别认为这个OpenLayers.Format.XML类很强大,它仅能完成对XML数据的基本操作。因此,如果有必要,我们可以用 JavaScript中的“Prototype原型构造法”来扩充OpenLayers.Format.XML()类的方法、属性。</p>
<p>当然,你也可以直接修改OpenLayers的核心文件(位置在OpenLayers\lib\OpenLayers\Format\XML.js,由于它继承了Format.js父类,因此我建议你顺便看一下父类)。</p>
<p>本例仅用DOM解析器,解析一个XML文件,这个XML文件中包含了电子地图的相关数据。你也可以结合其他的类的方法(以后讲)直接从电子地图上面输出真实的XML电子地图数据文件,然后转到Java中处理。或者,跨越过Java直接用JavaScript+SQL语句进行系统开发(由于不是重点,就不废话了)。</p>
<p>需要提醒的是,你得等XML文件全部加载完后,再点击下面的按钮。不然,就会有错误!因此,我建议你做一个"loading..."判断程序,以便序告知自己是否加载XML的状态。</p>
<p>上面的内容很多是我加的,不是英文翻译地,因此不能算翻译错误,谢谢!</p>
<div id="tags"></div>
<div id="docs">
    <b>基本方法:</b>
    <ul>
        <li>
            <a href="javascript:void write();">format.write()</a>以文本字符串输出这个XML文件。
        </li>
        <li>
            <a href="javascript:void getElementsByTagNameNS(doc, 'http://www.opengis.net/gml','MultiPolygon');">format.getElementsByTagNameNS()</a>
    输出名称空间为“gml:MultiPolygon”的标签,以及它的详细数据,子标签等等,并返回给一个具备数组类型特征的对象(写的比较难理解,是因为这个对象不一定就是数组类型对象,而是具备数组的特征!)
        </li>
        <li>
        <a href="javascript:void hasAttributeNS(doc.documentElement,'http://www.w3.org/2001/XMLSchema-instance','schemaLocation');">format.hasAttributeNS()</a>
        判断XML的文本字符串中“schemaLocation”属性的值是否等于“in the
    http://www.w3.org/2001/XMLSchema-instance”。返回一个Boolean对象,如果等于就输出“ture”,如果不等于就输出“false”。
        </li>
        <li>
            <a href="javascript:void getAttributeNodeNS(doc.documentElement,'http://www.w3.org/2001/XMLSchema-instance','schemaLocation');">format.getAttributeNodeNS()</a>
            输出XML文本字符串中“schemaLocation”这个完整的空间名称和它的值“in the http://www.w3.org/2001/XMLSchema-instance”。
        </li>
        <li>
            <a href="javascript:void getAttributeNS(doc.documentElement,'http://www.w3.org/2001/XMLSchema-instance','schemaLocation');">format.getAttributeNS()</a>
            仅仅输出XML文本字符串中“schemaLocation”属性的值“in the http://www.w3.org/2001/XMLSchema-instance”。
        </li>
        <li>
            <a href="javascript:void createElementNS('http://bar.com/foo','foo:TestNode');">format.createElementNS()</a>    
            创建一个空间名称为“foo:TestNode”的标签,并且把它加在这个已经存在的XML文件中的最后。
        </li>
        <li>
            <a href="javascript:void createTextNode('test text');">format.createTextNode()</a>
            创建具体的数据内容,并加进指定的“foo:TestNode”标签中。
        </li>
    </ul>
    <br>  
    <b>输出结果:</b><br>
    <div id="output">&nbsp;</div>
</div>

 

分享到:
评论

相关推荐

    我自己总结的openlayer开发文档

    在OpenLayer开发中,理解GIS地理信息和Shapefile格式是至关重要的。 Shapefile是ESRI公司推出的一种空间数据格式,广泛应用于地理信息系统(GIS)中。一个完整的Shapefile通常由多个文件组成,包括.shp、.shx、.dbf等...

    Openlayer项目分析

    每个格式都有对应的解析器类,位于`OpenLayers.Format`命名空间下。 3. **地图数据资源** OpenLayers可以连接并展示多种地图服务,包括但不限于WMS、WFS、Google Maps、KaMap、Microsoft Virtual Earth、NASA ...

    openLayers geoserver常见问题

    解析XML在OpenLayers中通常使用JavaScript的内置DOM解析器,例如`document.createElement`, `getElementsByTagName`, `getAttribute`等方法,或者使用jQuery等库简化操作。 关于OpenLayers的popup(弹窗),可以...

    openlayer v7

    标题提到的"openlayer v7"指的是该库的第七个主要版本。这个版本包含了丰富的功能和改进,使得开发者能够更加灵活和高效地构建地理信息系统(GIS)应用。 在提供的压缩包文件中,我们可以看到以下文件: 1. **ol....

    opendaylight-helium

    这个版本是OpenDaylight发展过程中的一个重要里程碑,它在2015年发布,为网络控制器提供了丰富的功能和改进。 OpenDaylight Helium版本包含了多个关键组件,这些组件在构建SDN解决方案时扮演着重要角色: 1. **...

    导入OpenStreetMap(OSM)地图数据

    在GIS(地理信息系统)领域,OpenStreetMap(OSM)是一个全球性的开源地图项目,它允许用户自由地创建和编辑地理数据。本教程将详细解释如何使用SuperMap iObject Java库来导入和显示OpenStreetMap的数据。 首先,...

    android-sliding-layer-lib源码.zip

    本篇将深度解析`android-sliding-layer-lib`这一开源库的源码,帮助开发者理解和应用这一组件。 一、库的简介与作用 `android-sliding-layer-lib`是一个专门为Android平台设计的滑动层库,它提供了简单易用的API来...

    onvif_wsdl

    这通常涉及到使用WSDL解析器和代码生成器,将WSDL文件转换为特定编程语言的客户端库。 7. **开发流程**: 开发ONVIF应用通常涉及以下步骤:理解WSDL文件中的服务和消息结构;使用SDK或自动生成的代码实现客户端;...

    geoserver-sld开发文档

    根据提供的文件信息,本文将详细解析“geoserver-sld开发文档”的相关内容,重点解读其在地理信息系统(GIS)中的应用、技术要点以及如何利用此文档进行Geoserver的样式编辑。 ### Geoserver简介 Geoserver是开源...

    Android 闪光灯手电筒软件源码-IT计算机-毕业设计.zip

    6. **生命周期管理**:Android应用的`Activity`有其特定的生命周期,开发者需要理解何时保存状态、恢复状态以及如何在后台适当地释放资源,防止内存泄漏。 7. **测试与调试**:在开发过程中,开发者需要在模拟器或...

    st开发环境的资料

    1. `[Content_Types].xml`:这是一个XML文件,它是Microsoft Office Open XML文档标准的一部分。它定义了压缩包内的不同文件类型的默认处理方式,帮助应用程序知道如何正确解析和显示内容。在ST开发环境的资料中,这...

    OGR 读取GML格式文件

    通过运行这些代码,你可以更深入地理解如何将理论知识应用于实际项目中。 总之,OGR库为处理GML文件提供了一种强大而灵活的方式,允许开发者轻松地读取、解析和操作GML中的空间数据。无论你是GIS开发人员还是数据...

    android4.0.3关联源码

    在Android系统中,源码是理解其工作原理和进行深度定制的关键。"android4.0.3关联源码"指的是Android 4.0.3版本的源代码,这个版本是Android Ice Cream Sandwich(冰淇淋三明治)的一部分。通过分析这个版本的源码,...

    android framework 经验总结

    在Android系统中,框架层(Framework)是操作系统的核心部分,它为应用程序提供了API接口,使得开发者可以方便地构建各种功能丰富的应用。这篇“Android Framework经验总结”将深入探讨这一关键领域的核心概念、主要...

    android 8 源文件

    3. **Framework**:这是Android应用开发的基础,包括Intent、Broadcast Receiver、Service等组件模型,以及XML布局文件解析和视图系统。 4. **Libraries**:Android包含许多库,如SQLite用于数据库操作,OpenSSL...

    Smack 4.2.4源码

    总之,Smack 4.2.4源码对于理解XMPP协议的工作原理、学习如何在Java应用中集成即时通讯功能,以及深入研究网络通信和事件驱动编程都有极大的价值。通过阅读和分析源码,开发者可以定制自己的功能,提升应用程序的...

    openlayers资料收集

    每种格式都有对应的解析器,这大大扩展了数据来源的多样性。 **4. 多样的数据源** OpenLayers 支持多种数据源,包括但不限于 WMS、WFS、Google Maps API、Bing Maps API、WorldWind 等。这意味着开发者可以根据...

    HTML 汇率换算源码.zip

    源码可能使用 AJAX 调用外部API,如Open Exchange Rates或Currency Layer,以获取最新的汇率信息。 4. **API 接口调用**: - 为了获取实时汇率,源码可能需要对接第三方API,这些API通常提供JSON格式的数据。...

    WAP无线应用协议2

    4. **应用层**:包含WAP浏览器、WML(Wireless Markup Language)解析器和各种应用服务器接口。 **三、WML与WAP浏览器** WML是专为WAP设计的一种标记语言,类似于HTML,但更适合小屏幕和有限输入设备。WML卡(Deck...

Global site tag (gtag.js) - Google Analytics