Java:创建KML文件并在现有文件中插入元素

时间:2013-09-10 17:10:46

标签: java android kml exif filewriter

我正在开发一个应用程序来读取照片的GPS-Exif信息,并将标签(Lat / Lon,...)写入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块之外...但这不是主要的问题

2 个答案:

答案 0 :(得分: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();
            }

    }

答案 1 :(得分:3)

修改XML文件时,最好使用某种库来完成。我维护XML-manipulation library called JDOM,旨在使这种操作尽可能简单。其他选项使用the DOM library(已经内置于Java运行时,这使得集成到您的程序更加容易),and SAX(在这种情况下,我不推荐,甚至虽然它可能更快)。存在其他外部库(如JDOM)也会有所帮助,如XOM,dom4j等。此stackoverflow答案似乎相关:Best XML parser for Java

在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'&gt;'上循环遍历String tokenizer deimeter,但你永远不会将令牌添加回输出(即你的输出正在铣削很多'&gt;'字符)。
  5. 您在每个'&gt;'的位置添加kmlelement位置内容文件中的特征,而不仅仅是重要文件。
  6. FileWriter逻辑应该在**循环外....你不想修改你修改的每个标记的文件。