Come inserire un nuovo nodo in un XML esistente

Vorrei inserire un nuovo nodo in un file xml esistente, ma il codice riportto di seguito inserisce nuovamente tutti i nodes.

Faccio un test se il file esiste. Altrimenti, creo un nuovo file xml e scrivo i tag. Se esiste, crea anche i nodes, ma il modo sbagliato.

  • Android: come aprire file pdf dal server in android
  • Come modificare i contenuti dummy in attività android master / dettaglio?
  • Bluetooth Parametri di connessione a bassa energia per Android, iOS e Win8
  • Come risparmiare meglio lo stato di acquisto di InApp localmente?
  • Come impostare ImageView trasparente
  • Errore durante l'innalzamento della class android.support.design.widget.CoordinatorLayout
  • //create a new file called "new.xml" in the SD card File newxmlfile = new File(Environment.getExternalStorageDirectory() + "/download/teste/audit.xml"); if (newxmlfile.exists()){ try{ fileos = new FileOutputStream(newxmlfile, true); }catch(FileNotFoundException e){ Log.e("FileNotFoundException", "can't create FileOutputStream"); } } else { try{ newxmlfile.createNewFile(); }catch(IOException e){ Log.e("IOException", "exception in createNewFile() method"); } try{ fileos = new FileOutputStream(newxmlfile); }catch(FileNotFoundException e){ Log.e("FileNotFoundException", "can't create FileOutputStream"); } } //we create a XmlSerializer in order to write xml data XmlSerializer serializer = Xml.newSerializer(); try { serializer.setOutput(fileos, "UTF-8"); serializer.startDocument(null, Boolean.valueOf(true)); serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); serializer.startTag(null, "root"); serializer.startTag(null, "child1"); serializer.endTag(null, "child1"); serializer.startTag(null, "child2"); serializer.attribute(null, "attribute", "value"); serializer.endTag(null, "child2"); serializer.startTag(null, "child3"); serializer.text("some text inside child3"); serializer.endTag(null, "child3"); serializer.endTag(null, "root"); serializer.endDocument(); serializer.flush(); fileos.close(); Context context = getApplicationContext(); CharSequence text = "Save!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show(); } catch (Exception e) { Log.e("Exception","error occurred while creating xml file"); } 

    Il risultato è questo:

     <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <root> <child1 /> <child2 attribute="value" /> <child3>some text inside child3</child3> </root><?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <root> <child1 /> <child2 attribute="value" /> <child3>some text inside child3</child3> </root> 

    Ma voglio il risultato come questo:

     <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <root> <child1 /> <child2 attribute="value" /> <child3>some text inside child3</child3> <child1 /> <child2 attribute="value" /> <child3>some text inside child3</child3> </root> 

    Grazie!

  • Visualizzazione di più righe di text in una window di dialogo di avviso
  • Come get refreshToken quando si utilizza GoogleAuthUtil
  • segnale fatale 11 SIGSEGV quando si chiude BluetoothSocket su Android 4.2.2 e 4.3
  • Mostra la window di dialogo della rotazione mentre carica dati su Android
  • Tasto di prossima tastiera di Android su EditText
  • getView restituisce null quando il frammento è stato creato da un'attività
  • One Solution collect form web for “Come inserire un nuovo nodo in un XML esistente”

    Sembra che non esista un'API in Android. Tuttavia, hai ancora le seguenti opzioni per risolvere il problema:

    • Cercare una libreria open-source che fornisce tale capacità;
    • Eseguire alcune operazioni di stringhe manuali utilizzando XmlSerializer , come indicato di seguito:

       private void testXMLFiles() { //create a new file called "new.xml" in the SD card final File newXmlFile = new File(Environment.getExternalStorageDirectory() + "/download/teste/audit.xml"); RandomAccessFile randomAccessFile = null; final boolean fileExists = newXmlFile.exists(); String lastLine = null; if (fileExists) { try { randomAccessFile = new RandomAccessFile(newXmlFile, "rw"); randomAccessFile.seek(0); if (null != randomAccessFile) { final Scanner scanner = new Scanner(newXmlFile); int lastLineOffset = 0; int lastLineLength = 0; while (scanner.hasNextLine()) { // +1 is for end line symbol lastLine = scanner.nextLine(); lastLineLength = lastLine.length() + 2; lastLineOffset += lastLineLength; } // don't need last </root> line offset lastLineOffset -= lastLineLength; // got to string before last randomAccessFile.seek(lastLineOffset); } } catch(FileNotFoundException e) { Log.e("FileNotFoundException", "can't create FileOutputStream"); } catch (IOException e) { Log.e("IOException", "Failed to find last line"); } } else { try { newXmlFile.createNewFile(); } catch(IOException e) { Log.e("IOException", "exception in createNewFile() method"); } try { randomAccessFile = new RandomAccessFile(newXmlFile, "rw"); } catch(FileNotFoundException e) { Log.e("FileNotFoundException", "can't create FileOutputStream"); } } //we create a XmlSerializer in order to write xml data XmlSerializer serializer = Xml.newSerializer(); if (randomAccessFile == null) { return; } try { final StringWriter writer = new StringWriter(); serializer.setOutput(writer); if (!fileExists) { serializer.startDocument(null, true); serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); serializer.startTag(null, "root"); } else { serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); } serializer.startTag(null, "child1"); serializer.endTag(null, "child1"); serializer.startTag(null, "child2"); serializer.attribute(null, "attribute", "value"); serializer.endTag(null, "child2"); serializer.startTag(null, "child3"); serializer.text("some text inside child3"); serializer.endTag(null, "child3"); if (!fileExists) { serializer.endTag(null, "root"); } serializer.flush(); if (lastLine != null) { serializer.endDocument(); writer.append(lastLine); } // Add \n just for better output in console randomAccessFile.writeBytes(writer.toString() + "\n"); randomAccessFile.close(); Toast.makeText(getApplicationContext(), "Save!", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Log.e("Exception","error occurred while creating xml file"); e.printStackTrace(); } } 

    La sua output dopo la seconda corsa è il seguente (molto simile a quello che ti aspetti):

     <?xml version='1.0' standalone='yes' ?> <root> <child1 /> <child2 attribute="value" /> <child3>some text inside child3</child3> <child1 /> <child2 attribute="value" /> <child3>some text inside child3</child3></root> 
    • Memorizzare tutti i tag da xml iniziale (ad esempio, utilizzando SAXParser è ansible leggere i tag, scrivere in un nuovo file alla stessa ora e applicare nuovi alla fine utilizzando XMLSerializer );
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.