2015-07-14 1 views
1

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

Файл 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: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?

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

ответ

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); 
  • Добавьте когда перед первой координатой.
  • Добавить место в конце.

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

Обратите внимание, что в вашем коде следует использовать общие данные. Значения List из 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); 
+0

Большое вам спасибо. Да, я буду работать над своим кодом и использовать больше дженериков. Спасибо за совет :) Ты потрясающий сэр – Giz