В настоящее время я пытаюсь разработать код с библиотеками Java 9 и javax.xml
(обе обязательны для моей задачи), который редактирует файл XML, и у меня возникают некоторые странные проблемы с добавлением дочерних узлов.
Это XML-файл:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
</users>
, и я хочу отредактировать его, построив что-то вроде этого:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
<user>
<name>A name</name>
<last-name>Last Name</last-name>
<username>username</username>
</user>
</users>
Теперь, первый запуск кода добавляет одну пустую строку перед<user>
узел. При повторном запуске заполняется большим количеством пустых строк:
<users>
<user>
<name>name</name>
<last-name>lastname</last-name>
<username>username</username>
</user>
<user>
<name>name</name>
<last-name>lastname</last-name>
<username>username</username>
</user>
</users>
Это XML, сгенерированный после запуска программы 2 раза. Как вы можете видеть, он добавляет пустые строки перед узлами <user>
и между другими узлами, ровно n-1 пустых строк между узлами - это n раз, когда был выполнен код.
Задаваясь вопросом о содержании этих узлов, перед обновлением файла я написал следующий код:
int i=0;
while (root.getChildNodes().item(i)!=null){
Node aux = root.getChildNodes().item(i);
System.out.println("Node text content: ".concat(aux.getTextContent()));
i++;
}
1-е выполнение:
Node text content:
Node text content: namelastnameusername
2-е выполнение:
Node text content:
Node text content:
name
lastname
username
Node text content:
Node text content: namelastnameusername
3-е выполнение
Node text content:
Node text content:
name
lastname
username
Node text content:
Node text content:
name
lastname
username
Node text content:
Node text content: namelastnameusername
Наконец, это код Java:
private static void saveUser(String firstName, String lastName, String username){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File(databaseFile));
Element root = doc.getDocumentElement();
root.normalize();
// build user node
Element userNode = doc.createElement("user");
Element nameNode = doc.createElement("name");
Element lastNameNode = doc.createElement("last-name");
Element usernameNode = doc.createElement("username");
//build structure
nameNode.appendChild(doc.createTextNode(firstName));
lastNameNode.appendChild(doc.createTextNode(lastName));
usernameNode.appendChild(doc.createTextNode(username));
userNode.appendChild(nameNode);
userNode.appendChild(lastNameNode);
userNode.appendChild(usernameNode);
root.appendChild(userNode);
//write the updated document to file or console
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(databaseFile));
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(source, result);
}catch (SAXException | ParserConfigurationException | IOException | TransformerException e1) {
e1.printStackTrace();
}
}
Единственное решение, которое я смог найти, это удалить пустые строки после генерации XML,но я думаю, что это не правильное решение, и я хотел бы сначала найти некоторые альтернативы.
Есть предложения о том, как решить эту проблему?