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;
}
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! –