2011-06-03 62 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