2013-05-18 8 views
0

Я хотел бы вставить новый узел в существующий xml-файл, но приведенный ниже код снова вставляет все узлы.Как вставить новый узел в существующий XML

Выполняю тест, если файл существует. Если нет, я создаю новый XML-файл и пишу теги. Если существует, он также создает узлы, но не так.

//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"); 
} 

Результат таков:

<?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> 

Но я хочу, чтобы результат так:

<?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> 

Спасибо!

+0

Итак, проблема заключается в следующем: создается другой корень вместо использования существующего (в случае если файл уже содержит child1-3), правильно? Кстати в коде нет вставки child4-6. – sandrstar

+0

Правильно. Я хочу: Если документ не существует, он создает структуру по умолчанию, а затем вставляет узел. И если документ существует, вставьте новый узел внутри корневого узла и не повторяйте структуру ' " ' – Wesley

+1

@ Уэсли: Может, пожалуйста, помогите мне с моей аналогичной проблемой? Http://stackoverflow.com/questions/21318966/adding-a-node-to-same-xml-file-on-sd-card-under-its-root- tag-in-android –

ответ

1

Похоже, в Android нет такого API. Тем не менее, у вас все еще есть возможность исправить проблему:

  • Ищите библиотеку с открытым исходным кодом, которая предоставляет такие возможности;
  • ли некоторые ручные операции со строками до сих пор используют XmlSerializer, как приведено ниже:

    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(); 
        } 
    } 
    

Его выход после второго запуска следующий (очень похоже на то, что Вы ожидаете):

<?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> 
  • Сохраните все теги из исходного xml (например, с помощью SAXParser вы можете читать теги, писать в новый файл одновременно и добавлять новые в конце с использованием XMLSerializer);
+0

До создания 2º файл json генерируется правильно. С 3º он вставляет тег после последних узлов и и до корня конечного узла. '1º узел некоторый текст ... 3о года какой-либо текст ... некоторые из них ... некоторые ... ' Но ты дал мне дорогу. Теперь он настраивает скрипт только для правильной генерации. Спасибо – Wesley

+0

Правильно, кажется, новая строка должна быть добавлена, чтобы иметь на новой строке. – sandrstar

+0

@sandrstar: У меня есть аналогичная проблема, как вопрос выше. Не могли бы вы помочь мне с моим вопросом? http://stackoverflow.com/questions/21318966/adding-a-node-to-same-xml-file-on-sd-card-under-its-root-tag-in-android Буду признателен , –

Смежные вопросы