2

JDOM(XPATH)でKMLを読み込もうとしています。エラーは例外によってキャッチされず、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>
4

1 に答える 1

2

表示されているエラーは、webapp の展開の問題のようです。完全なスタック トレースを原因とともに投稿していただければ、さらにお役に立てるかもしれません。必要なすべての 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 でデモ タイプをコンパイルするには、JDOM が必要javac -cp jars\jdom.jar ReadKml.javaです。デモを実行するには Jaxen も必要なので、それをクラスパスに追加します。たとえば、java -cp .;jars\jdom.jar;jars\jaxen.jar ReadKml

これにより、 の System.output が生成されLookAtますElement.name()

これが役立つことを願っています。

于 2011-06-04T07:41:35.560 に答える