Ошибка XPATH KML JDOM

Я пытаюсь прочитать KML с помощью JDOM (XPATH). Ошибка не перехватывается исключениями, только при наведении указателя мыши на код в строке XPath.newInstance("//Kml/Document/Placemark/LookAt"); Ошибка, которую я вижу:

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>

person Thiago C. S Ventura    schedule 03.06.2011    source источник


Ответы (1)


Ошибка, которую вы видите, выглядит как проблема с развертыванием веб-приложения. Если вы опубликуете полную трассировку стека с Cause, я смогу помочь в дальнейшем. Включили ли вы все необходимые банки в проект?

Однако есть несколько других проблем, которые необходимо исправить, иначе код не будет работать должным образом.

Во-первых, файл KML недействителен. Закрывающий тег </Kml> не соответствует открывающему тегу <kml>. XML чувствителен к регистру.

Во-вторых, используемый вами XPath не поддерживает пространство имен. Предполагается, что тег без префикса находится в пространстве имен по умолчанию. Вам нужно добавить это пространство имен по умолчанию.

Я сделал небольшую демонстрацию, которая загружает и анализирует следующий файл 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>

Демонстрационный класс (сохраните его как файл с именем 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 находился в пути к классам для компиляции, например, в Windows для компиляции демо типа javac -cp jars\jdom.jar ReadKml.java. Для запуска демонстрации также требуется Jaxen, поэтому добавьте его в путь к классам, например java -cp .;jars\jdom.jar;jars\jaxen.jar ReadKml

Это приводит к System.output LookAt, который является просто Element.name().

Надеюсь, это поможет.

person andyb    schedule 04.06.2011
comment
Энди, я хотел бы поблагодарить за помощь. теперь он функционировал. ошибка была в пространстве имен и JAR JAR спасибо - person Thiago C. S Ventura; 06.06.2011