2015-11-24 2 views
0

J'ai développé une méthode qui acquiert une collection de listes avec des données à écrire dans un fichier XML. Tout d'abord, je vérifie l'existence du fichier, en fonction de l'existence je crée un nouveau fichier et écris les données ou ajoute les donnéesJava créer un nouveau fichier XML et l'ajouter

Je ne pouvais pas savoir où l'erreur est, j'ai vérifié les liens ci-dessous mais je pense que je suis loin de la solution.

http://www.coderanch.com/t/561569/XML/Appending-data-existing-XML-file

Il a d'abord créé le fichier, il est avec succès aucun problème à ce moment-là, mais quand il ne vient à annexant le fichier que je faire face à l'exception:

Le balisage dans le document suivant la racine l'élément doit être bien formé. Exception dans createXMLFile org.xml.sax.SAXParseException; systemId:

fichier xml de l'échantillon est:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <text> 
     <sentence> 
      <word>data</word> 
      <word>data1</word> 
      <word>data2</word> 
      <word>data3</word> 
      <word>data4</word> 
      <word>data5</word> 
    </sentence> 
</text> 



protected boolean fileExists(String filePath) { 
     if (new File(filePath).isFile()) 
      return new File(filePath).exists(); 
     return false; 
    } 

public File write(List<Sentence> sentenceData) { 
     File file = null; 
     try { 
      final String fileName = getWorkingPath() + FileConstants.XML_FILE_NAME; 
      boolean fileExist = fileExists(fileName); 
      DocumentBuilderFactory docFactory = DocumentBuilderFactory 
        .newInstance(); 
      DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
      Document doc = null; 
      if(fileExist) 
       doc = docBuilder.parse(fileName); 
      else 
       doc = docBuilder.newDocument(); 
      // text element 
      Element rootElement = doc.createElement("text"); 
      doc.appendChild(rootElement); 

      // Iterate through sentence data 
      ListIterator<Sentence> listIterator = sentenceData.listIterator(); 
      while (listIterator.hasNext()) { 
       Sentence obj = (Sentence) listIterator.next(); 

       // sentence elements 
       Element sentence = doc.createElement("sentence"); 
       rootElement.appendChild(sentence); 

       // Iterate through words in the sentence 
       for (String wordListData : obj.getWordList()) { 
        String wordData = wordListData; 

        // word elements in a sentence 
        Element word = doc.createElement("word"); 
        word.appendChild(doc.createTextNode(wordData)); 
        sentence.appendChild(word); 
       } 

       // remove the element 
       listIterator.remove(); 
      } 

      // write the content into xml file 
      Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
      transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
      StreamResult result = new StreamResult(new FileWriter(fileName)); 
      DOMSource source = new DOMSource(doc); 
      transformer.transform(source, result); 

     } catch (ParserConfigurationException e) { 
      logger.error("Exception in createXMLFile " + e); 
     } catch (TransformerException e) { 
      logger.error("Exception in createXMLFile " + e); 
     } catch (SAXException e) { 
      logger.error("Exception in createXMLFile " + e); 
     } catch (IOException e) { 
      logger.error("Exception in createXMLFile " + e); 
     } 
     return file; 
    } 

Edit: J'ai trouvé ce que je manqué, et ravi de mettre la réponse ici, mais je suis arrivé en retard :) le dessous du code source complet vous peut trouver. J'espère que cela aidera les autres à l'avenir.

public File write(List<Sentence> sentenceData) { 
    final String fileName = getWorkingPath() + FileConstants.XML_FILE_NAME; 
    final boolean fileExist = fileExists(fileName); 
    File file = new File(fileName); 

    try { 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = null; 
     Element textElement = null; 
     //Proceed depending on file existence 
     if(fileExist){ 
      //File exists 
      doc = docBuilder.parse(file); 
      textElement = doc.getDocumentElement(); 
      // Iterate through sentence data 
      ListIterator<Sentence> listIterator = sentenceData.listIterator(); 
      while (listIterator.hasNext()) { 
       Sentence obj = (Sentence) listIterator.next(); 
       Element sentenceElement = doc.createElement("sentence"); 

       //Iterate through word list 
       for(String word : obj.getWordList()){ 
        Element wordElement = doc.createElement("word"); 
        wordElement.appendChild(doc.createTextNode(word)); 
        sentenceElement.appendChild(wordElement); 
       } 
       textElement.appendChild(sentenceElement); 
      } 
     }else{ 
      //File does not exist 
      doc = docBuilder.newDocument(); 
      textElement = doc.createElement("text"); 
      doc.appendChild(textElement); 
      // Iterate through sentence data 
      ListIterator<Sentence> listIterator = sentenceData.listIterator(); 
      while (listIterator.hasNext()) { 
       Sentence obj = (Sentence) listIterator.next(); 

       // sentence elements 
       Element sentenceElement = doc.createElement("sentence"); 
       textElement.appendChild(sentenceElement); 

       // Iterate through words in the sentence 
       for (String wordListData : obj.getWordList()) { 
        String wordData = wordListData; 

        // word elements in a sentence 
        Element wordElement = doc.createElement("word"); 
        wordElement.appendChild(doc.createTextNode(wordData)); 
        sentenceElement.appendChild(wordElement); 
       } 
      } 
     } 

     Transformer transformer = TransformerFactory.newInstance() 
       .newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(file); 
     transformer.transform(source, result); 
    } catch (ParserConfigurationException e) { 
     logger.error("Exception in write " + e); 
    } catch (SAXException e) { 
     logger.error("Exception in write " + e); 
    } catch (IOException e) { 
     logger.error("Exception in write " + e); 
    } catch (TransformerConfigurationException e) { 
     logger.error("Exception in write " + e); 
    } catch (TransformerFactoryConfigurationError e) { 
     logger.error("Exception in write " + e); 
    } catch (TransformerException e) { 
     logger.error("Exception in write " + e); 
    } 

    return file; 

} 

Répondre

0

Je simulé votre code ici et ne l'a réalisé que vous ne créez pas un élément racine valide dans le fichier XML, c'est pourquoi vous faire l'exception.

Voir mes résultats que je recevais en cours d'exécution de la méthode d'écriture:

public static void main(String... x) { 
    Sentence s = new Sentence(); 
    Main m = new Main(); 
    List<Sentence> list = new ArrayList<Sentence>(); 
    list.add(s); 
    m.write(list); 
} 

classe phrase:

public class Sentence { 
    public String[] getWordList() { 
     return new String[] { "w4", "w5", "w6" }; // previous: w1,w2,w3 
    } 
} 

file.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<text> 
    <sentence> 
     <word>w1</word> 
     <word>w2</word> 
     <word>w3</word> 
    </sentence> 
    <sentence> 
     <word>w4</word> 
     <word>w5</word> 
     <word>w6</word> 
    </sentence> 
    <sentence> 
     <word>w4</word> 
     <word>w5</word> 
     <word>w6</word> 
    </sentence> 
</text> 

Solution: Il suffit de remplacer votre code avec ce qui suit:

// text element 
Element rootElement = null; 
if (!fileExist) { 
    rootElement = doc.createElement("text"); 
    doc.appendChild(rootElement); 
} else { 
    rootElement = doc.getDocumentElement(); // get the root [text] element 
} 
+1

Merci pour votre réponse et votre solution aelkz! C'était la première fois que j'utilisais le lib et j'étais ravi de partager mon résultat ici mais tu étais le premier :) J'ai totalement raté la différence! –