Ошибка XPATH KML JDOM - PullRequest
2 голосов
/ 04 июня 2011

Я пытаюсь прочитать 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>

1 Ответ

2 голосов
/ 04 июня 2011

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

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

Во-первых, файл 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, поэтому добавьте его в classpath, например, java -cp .;jars\jdom.jar;jars\jaxen.jar ReadKml

В результате получается System.output LookAt, который просто является Element.name().

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

...