Please tell me what I'm doing wrong. I work with javafx and by clicking on the button, when the listview element is selected, I pass an object of the Country class to the editing method, but the xml file is not being edited, what is the problem? I attached an xml file, a broken edit function and a working delete function. I think it's about the setContext I'm calling? But I'm not sure
Xml file:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<CountrysList lastId="3">
<Country id="1">
<name>Russia</name>
<continent>Eurasia</continent>
<area>17125191</area>
<population>145557576</population>
<capital>Moscow</capital>
</Country>
<Country id="2">
<name>Russia</name>
<continent>Eurasia</continent>
<area>17125191</area>
<population>145557576</population>
<capital>Moscow</capital>
</Country>
<Country id="3">
<name>Russia</name>
<continent>Eurasia</continent>
<area>17125191</area>
<population>145557576</population>
<capital>Moscow</capital>
</Country>
Element search function:
public Element findCountry(Document document, int id) {
NodeList countries = document.getElementsByTagName("Country");
Element currentCountry = null;
int i = 0;
while(i < countries.getLength() && currentCountry == null){
Node node = countries.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE){
Element element = (Element) node;
if(String.valueOf(id).equals(element.getAttribute("id"))){
currentCountry = element;
}
}
i ;
}
return currentCountry;
}
Broken editing function:
public void redact(Country country) throws ParserConfigurationException, IOException, SAXException, TransformerException {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document document = docBuilder.parse(path);
Element currentCountry = findCountry(document, country.getId());
if(currentCountry != null){
NodeList children = currentCountry.getChildNodes();
for (int j=0; j < children.getLength(); j ){
Node node = children.item(j);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
switch (element.getTagName()){
case "name":
element.setTextContent(country.getName());
break;
case "continent":
element.setTextContent(country.getContinent());
break;
case "area":
element.setTextContent(String.valueOf(country.getArea()));
break;
case "population":
element.setTextContent(String.valueOf(country.getPopulation()));
break;
case "capital":
element.setTextContent(country.getCapital());
break;
}
}
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(document), new StreamResult(path));
}
}
Working deletion function:
public void delete(Country country) throws ParserConfigurationException, IOException, SAXException, TransformerException {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document document = docBuilder.parse(path);
Element rootElement = document.getDocumentElement();
Element currentCountry = findCountry(document, country.getId());
if(currentCountry != null){
rootElement.removeChild(currentCountry);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(document), new StreamResult(path));
}
}
CodePudding user response:
I found the mistake.Everything is really like that, I forgot to create a new instance of the class with the changed fields and passed it with the previous ones, so everything worked