有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在开发一个应用程序,可以读取照片的GPS Exif信息并写入标签(Lat/Lon,…)在KML或CSV文件中。 如果文件不存在,尤其是csv,则创建这些文件不是问题,但在本例中,我想向现有KML文件添加一个新的KML-placemark

到目前为止,我已经创建了一个方法来检查文件是否已经存在——如果不存在(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中没有任何日志,但如果我尝试更新现有文件,应用程序将停止工作。。。有什么建议吗? 提前谢谢

编辑:好的,我看到了内容。添加(0,kml…)必须在试用区之外。。。但这似乎不是主要问题


共 (2) 个答案

  1. # 1 楼答案

    修改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 delimeter是">",这从来不是解析XML的好方法
    4. 在evert'>;'上循环字符串标记器delimeter,但您永远不会将令牌添加回输出(即,您的输出正在处理大量“>;”字符)
    5. 将kmlelement Position内容添加到每个“>;”的位置文档中的字符,而不仅仅是重要的字符
    6. FileWriter逻辑应该**在**循环之外。。。。您不想为您修改的每个标记修改文件
  2. # 2 楼答案

    它现在正在工作,感谢您的输入! 在我的程序中,我已经用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();
                }
    
        }