2011-06-03 48 views
2

我正在尝试使用JDOM(XPATH)读取KML。错误不会被Exceptions捕获,只能通过鼠标悬停在代码行XPath.newInstance(“// Kml/Document/Placemark/LookAt”);我看到的错误是:错误XPATH KML JDOM

XPath.newInstance("//Kml/Document/Placemark/LookAt"); = >Exception occurred in target VM: WEB9031: WebappClassLoader unable to load resource [java.lang.ExceptionInInitializerError], because it has not yet been started, or was already stopped<

我的代码:

public void lerKML() throws Exception { 
    String path = req.getRealPath("/Usuarios/" + pe.getEmail() + "/"+ pe.getTitulo() + "/" + pe.getNomeArquivoKMLZ()); 

    SAXBuilder builder = new SAXBuilder(); 
    Document document = builder.build(new File(path)); 

    XPath xPath = XPath.newInstance("//Kml/Document/Placemark/LookAt"); 

    Element node = (Element) xPath.selectSingleNode(document.getRootElement()); 
    ... 
} 

示例KML文件:

<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
<Document> 
<Placemark> 
    <name>teste</name> 
    <LookAt> 
     <longitude>-47.82056628282606</longitude> 
     <latitude>-15.78921645504241</latitude> 
     <altitude>0</altitude> 
     <heading>0</heading> 
     <tilt>0</tilt> 
     <range>668.1932383230591</range> 
    </LookAt> 
</Placemark> 
</Document> 
</Kml> 

回答

2

您所看到的错误,它看起来像一个web应用程序的部署问题。如果您发布完整堆栈跟踪原因我可能能够进一步提供帮助。你有没有把所有需要的罐子包括在项目中?

但是,还有其他一些问题需要解决,否则代码将无法按预期工作。

首先,KML文件无效。结束标记</Kml>与开始标记<kml>不匹配。 XML区分大小写。

其次,您正在使用的XPath不是namespace。假定没有前缀的标签位于默认名称空间中。您需要添加此默认命名空间。

我做了一个小的演示加载和分析以下KML(修正)文件(保存为test.kml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
<Document> 
    <Placemark> 
     <name>teste</name> 
     <LookAt> 
     <longitude>-47.82056628282606</longitude> 
     <latitude>-15.78921645504241</latitude> 
     <altitude>0</altitude> 
     <heading>0</heading> 
     <tilt>0</tilt> 
     <range>668.1932383230591</range> 
     </LookAt> 
    </Placemark> 
</Document> 
</kml> 

Demo类(保存为一个名为ReadKml.java文件,放在同一个目录中test.kml

import java.io.*; 
import org.jdom.input.SAXBuilder; 
import org.jdom.Document; 
import org.jdom.Element; 
import org.jdom.xpath.XPath; 

public class ReadKml { 
    public static void main(String args[]) throws Exception { 
     File kmlFile = new File("test.kml"); 
     SAXBuilder builder = new SAXBuilder(); 
     Document document = builder.build(kmlFile); 

     XPath xPath = XPath.newInstance("//k:kml/k:Document/k:Placemark/k:LookAt"); 
     xPath.addNamespace("k", document.getRootElement().getNamespaceURI()); 

     Element node = (Element) xPath.selectSingleNode(document.getRootElement()); 
     System.out.println(node.getName()); 
    } 
} 

演示要求JDOM是在类路径中进行编译,FO例如在Windows上编译演示类型javac -cp jars\jdom.jar ReadKml.java。运行演示程序还需要Jaxen,因此请将其添加到类路径中,例如java -cp .;jars\jdom.jar;jars\jaxen.jar ReadKml

这会导致System.output为LookAt,这就是Element.name()

我希望这会有所帮助。

+0

安迪,我想感谢的帮助。 现在起作用。 错误是命名空间和JAR jaxen 谢谢 – Ventura 2011-06-06 00:27:31