Вставьте новый элемент между элементами в KML, используя JDOM в java

Я использую JDOM для создания и изменения файла KML. Каждые 5 секунд я получаю новые значения широты, долготы и времени от клиентского приложения. Мне нужно изменить существующий файл и добавить в него последние значения широты, долготы и времени.

Файл XML приведен ниже.

<?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://www.opengis.net/kml/2.2"
     xmlns:gx="http://www.google.com/kml/ext/2.2">
     <Document>
      <Folder>
       <Placemark>
       <name>deviceA</name>
        <gx:Track>
          <when>2015-06-28T17:02:09Z</when>
          <when>2015-06-28T17:02:35Z</when>
          <gx:coord>3.404258 50.605892 100.000000</gx:coord>
          <gx:coord>3.416446 50.604040 100.000000</gx:coord>
        </gx:Track>
       </Placemark>
       <Placemark>
        <name>deviceB</name>
         <gx:Track>
          <when>2015-06-28T17:02:09Z</when>
          <when>2015-06-28T17:02:35Z</when>
          <gx:coord>3.403133 50.601702 100.000000</gx:coord>
          <gx:coord>3.410171 50.597344 100.000000</gx:coord>
         </gx:Track>
       </Placemark>
      </Folder>
     </Document>
    </kml>

Я использую следующий код для вставки значения

SAXBuilder builder = new SAXBuilder();
File xmlFile = new File(outputFile);
try {

        Document doc = (Document) builder.build(xmlFile);
        Element rootNode = doc.getRootElement();
        Element docNode = rootNode.getChild("Document",ns);
        Element folNode = docNode.getChild("Folder",ns);

        List list = folNode.getChildren("Placemark",ns);

        if(list.size()>0)
        {
            Element node = (Element) list.get(deviceid);
            Element tracknode = node.getChild("Track",ns2);
            List wlist = tracknode.getChildren("when",ns);

            Element newWhen = new Element("when",ns);
            newWhen.setText(whentext);

            Element newCoord = new Element("coord",ns2);
            newCoord.setText(coordtext);

            System.out.println("When size:"+wlist.size());

            int index =0;
            if(wlist.size()==0) index =0;
            else index= wlist.size()+1;

            tracknode.addContent(index, newWhen);
            tracknode.addContent(newCoord);                 
        }

        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        FileOutputStream writer = new FileOutputStream(outputFile);
        outputter.output(doc, writer);
        writer.flush();
        writer.close();

} catch (IOException io) {
  System.out.println(io.getMessage());
} catch (JDOMException jdomex) {
  System.out.println(jdomex.getMessage());
}

Часть «gx:coord» правильно вставлена ​​в конце элементов, но новый элемент when необходимо вставить в конец элементов «когда». Итак, я получаю список детей с тегом «когда». Получите размер списка элементов и вставьте его в индекс после последнего элемента. Первые две вставки в порядке, третья вставка и далее я сталкиваюсь со странной проблемой. Новый элемент «когда» вставляется между существующими элементами «когда», а не в конец списка элементов «когда». Например

<gx:Track>
  <when>2015-06-28T17:02:09Z</when>
  <when>2015-06-28T17:02:44Z</when>
  <when>2015-06-28T17:02:35Z</when>
  <gx:coord>3.404258 50.605892 100.000000</gx:coord>
  <gx:coord>3.416446 50.604040 100.000000</gx:coord>
  <gx:coord>3.429492 50.602078 100.000000</gx:coord>
</gx:Track>

Я хотел бы вставить новый элемент «когда» после всех существующих элементов «когда». Есть ли способ сделать это с помощью JDOM в java?

Любая помощь приветствуется


person gfernandes    schedule 14.07.2015    source источник


Ответы (1)


В JDOM списки являются живыми, даже отфильтрованными списками содержимого, которые содержат только подмножество элементов в родительском элементе.

Например, ваш код для создания узлов элементов в порядке:

        Element newWhen = new Element("when",ns);
        newWhen.setText(whentext);

        Element newCoord = new Element("coord",ns2);
        newCoord.setText(coordtext);

Но как насчет того, чтобы добавить их, например:

        Element firstcoord = tracknode.getChild("coord",ns2);
        tracknode.addContent(tracknode.indexOf(firstcoord), newWhen);
        tracknode.addContent(newCoord);
  • Добавьте когда перед первой координатой.
  • Добавьте где в конце.

Однако, если дорожка пуста, вам понадобится другое решение.

Обратите внимание, что вы должны больше использовать дженерики в своем коде. Все значения списка из JDOM совместимы с дженериками и полезны. Вот полный (модифицированный) код, который я использовал для проверки вышеизложенного:

    Document doc = new SAXBuilder().build("locations.kml");

    Namespace ns = Namespace.getNamespace("http://www.opengis.net/kml/2.2");
    Namespace ns2 = Namespace.getNamespace("gx", "http://www.google.com/kml/ext/2.2");

    Element rootNode = doc.getRootElement();
    Element docNode = rootNode.getChild("Document",ns);
    Element folNode = docNode.getChild("Folder",ns);

    List<Element> list = folNode.getChildren("Placemark",ns);

    if(!list.isEmpty())
    {
        Element node = list.get(0);
        Element tracknode = node.getChild("Track",ns2);

        Element newWhen = new Element("when",ns);
        newWhen.setText("WHEN");

        Element newCoord = new Element("coord",ns2);
        newCoord.setText("WHERE");

        Element firstcoord = tracknode.getChild("coord",ns2);
        tracknode.addContent(tracknode.indexOf(firstcoord), newWhen);
        tracknode.addContent(newCoord);

    }

    XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
    outputter.output(doc, System.out);
person rolfl    schedule 14.07.2015
comment
Большое спасибо. Да, я буду работать над своим кодом и использовать больше дженериков. Спасибо за совет :) Вы классный сэр - person gfernandes; 14.07.2015