2

我正在开发一个应用程序,它可以读取照片的 GPS-Exif 信息并将标签(纬度/经度,...)写入 KML 或 CSV 文件。如果文件不存在,尤其是 csv,则创建文件不是问题,但在这种情况下,我想将新的 KML 地标添加到现有的 KML 文件中。

到目前为止,我已经创建了一种方法来检查文件是否已经存在 - 如果不存在(if 语句),它会创建一个新文件。如果文件存在,则应添加信息(否则)。

public void createKMLFile(){


        String kmlstart = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                        "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n";

        String kmlelement ="\t<Placemark>\n" +
                            "\t<name>Simple placemark</name>\n" +
                            "\t<description>"+name+"</description>\n" +
                            "\t<Point>\n" +
                            "\t\t<coordinates>"+latlon[1]+","+latlon[0]+","+z+ "</coordinates>\n" +
                            "\t</Point>\n" +
                            "\t</Placemark>\n";

        String kmlend = "</kml>";

        ArrayList<String> content = new ArrayList<String>();
        //content.add(0,kmlstart);
        //content.add(1,kmlelement);
        //content.add(2,kmlend);

        String kmltest;


        //Zum Einsetzen eines Substrings (weitere Placemark)
        //String test = "</kml>";
        //int index = kml.lastIndexOf(test);

        File test = new File(datapath+"/"+name+".kml");
        Writer fwriter;

        if(test.exists() == false){
            try {
                content.add(0,kmlstart);
                content.add(1,kmlelement);
                content.add(2,kmlend);
                kmltest = content.get(0) + content.get(1) + content.get(2);

                fwriter = new FileWriter(datapath+"/"+name+".kml");
                fwriter.write(kmltest);
                //fwriter.append("HalloHallo", index, kml.length());
                fwriter.flush();
                fwriter.close();
            }catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }   
        }
        else{
            kmltest = content.get(0) + content.get(1) + content.get(2);
            StringTokenizer tokenize = new StringTokenizer(kmltest, ">");
            ArrayList<String> append = new ArrayList<String>();
            while(tokenize.hasMoreTokens()){

            append.add(tokenize.nextToken());
            append.add(1, kmlelement);

            String rewrite = append.toString();
            try {
                fwriter = new FileWriter(datapath+"/"+name+".kml");
                fwriter.write(rewrite);
                fwriter.flush();
                fwriter.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            }

        }



    }

我在 LogCat 中没有任何日志,但如果我尝试更新现有文件,应用程序将停止工作......有什么建议吗?提前致谢

编辑:好的,我看到 content.add(0, kml...) 必须在 try 块之外...但这似乎不是主要问题

4

2 回答 2

4

它现在可以工作了,感谢您的输入 rolfl!在我的程序中,我已经使用 JDOM 库实现了该方法,这更加舒适,无论如何,如果有人感兴趣,这是我第一次尝试的工作代码。输出的格式不是很漂亮,但 kml 文件正在工作..

public void createKMLFile(){



        String kmlstart = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                        "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n";

        String kmlelement ="\t<Placemark>\n" +
                            "\t<name>Simple placemark</name>\n" +
                            "\t<description>"+name+"</description>\n" +
                            "\t<Point>\n" +
                            "\t\t<coordinates>"+latlon[1]+","+latlon[0]+","+z+ "</coordinates>\n" +
                            "\t</Point>\n" +
                            "\t</Placemark>\n";

        String kmlend = "</kml>";

        ArrayList<String> content = new ArrayList<String>();
        content.add(0,kmlstart);
        content.add(1,kmlelement);
        content.add(2,kmlend);

        String kmltest = content.get(0) + content.get(1) + content.get(2);


        File testexists = new File(datapath+"/"+name+".kml");
        Writer fwriter;

        if(!testexists.exists()){
            try {

                fwriter = new FileWriter(datapath+"/"+name+".kml");
                fwriter.write(kmltest);
                fwriter.flush();
                fwriter.close();
            }catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }   
        }

        else{

            //schleifenvariable
            String filecontent ="";

            ArrayList<String> newoutput = new ArrayList<String>();;

            try {
                BufferedReader in = new BufferedReader(new FileReader(testexists));
                while((filecontent = in.readLine()) !=null)

                    newoutput.add(filecontent);

            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            newoutput.add(2,kmlelement);

            String rewrite ="";
            for(String s : newoutput){
                rewrite += s;
            }

            try {
                fwriter = new FileWriter(datapath+"/"+name+".kml");
                fwriter.write(rewrite);
                fwriter.flush();
                fwriter.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    }
于 2013-09-11T17:01:59.537 回答
3

在修改 XML 文件时,最好使用某种库来完成。我维护名为 JDOM 的 XML 操作库,它旨在使这种操作尽可能简单。其他选项是使用DOM 库(它已经内置在 Java 运行时中,这使得它更容易集成到您的程序中)和 SAX(在这种情况下,我不推荐它,即使它可能更快)。存在其他外部库(如 JDOM)也会有所帮助,如 XOM、dom4j 等。这个 stackoverflow 答案似乎相关:Java 的最佳 XML 解析器

在 JDOM 中,您的代码将类似于:

    Document doc = null;
    Namespace kmlns = new Namespace("http://www.opengis.net/kml/2.2");
    Element position = new Element("Position", kmlns);
    position.addContent(new Element("name", kmlns).setText(positionName));
    position.addContent(new Element("desc", kmlns).setText(description));
    position.addContent(.....   all the XML content needed for the Position ....);

    // create the XML Document in memory if the file does not exist
    // otherwise read the file from the disk
    if(!test.exists()){
            doc = new Document();
            Element root = new Element("kml", kmlns);
    } else {
            SAXBuilder sb = new SAXBuilder();
            doc = sb.build(test);
    }

    Element root = doc.getRootElement();
    // modify the XML as you need
    // add Position Element
    root.addContent(position);

    try {
        fwriter = new FileWriter(datapath+"/"+name+".kml");
        XMLOutputter xout = new XMLOutputter(Format.getPrettyFormat());
        xout.output(doc, writer);
        fwriter.flush();
        fwriter.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

编辑:你问你的实际代码有什么问题......有一些事情会导致你的问题,但你没有显示实际错误,或者程序如何“停止工作”的其他迹象。

  1. 您的代码中存在应该引发严重异常的错误:kmltest = content.get(0) + content.get(1) + content.get(2);应该抛出 IndexOutOfBoundsException 因为内容 ArrayList 是空的(向 ArrayList 添加值的行被注释掉......) - 但我们假设它们不是......
  2. 你从来没有读过你正在改变的文件,那么你怎么能改变它呢?
  3. StringTokenizer 分隔符是">",这绝不是解析 XML 的好方法。
  4. 您在 evert '>' 分隔符上循环遍历字符串标记器,但您永远不会将标记重新添加到输出中(即您的输出正在铣削很多 '>' 字符)。
  5. 您将 kmelement Position 内容添加到文档中每个 '>' 字符的位置,而不仅仅是重要的字符。
  6. FileWriter 逻辑应该**在循环之外**......您不想为您修改的每个令牌修改文件。
于 2013-09-10T17:46:43.843 回答