This is my XML file
<?xml version="1.0" encoding ="utf-8" ?>
<mcss>
<quest ans="1">
<question><![CDATA[Write 5x= 3y-1 as linear equation form.]]></question>
<options>
<option><![CDATA[5x-3y+1=0]]></option>
<option><![CDATA[-5x-3y-1=0]]></option>
<option><![CDATA[5x+3y+1=0]]></option>
</options>
<explaination><![CDATA[Recall the linear equation in two variables form.]]></explaination>
</quest>
</mcss>
I just want to remove 2nd one option from my xml.
My java code remove all option from my options element. by using option.getParentElement().removeChild("option");
try {
String path="D://test//n2027_set1.xml";
File structureXml = new File(path);
SAXBuilder saxb = new SAXBuilder();
Document document = saxb.build(structureXml);
Element rootElement = document.getRootElement();
XMLOutputter xmlOutput = new XMLOutputter();
List qestList = rootElement.getChildren();
for (int i = 0; i < qestList.size(); i++) {
Element quesList = (Element) qestList.get(i);
System.out.println(quesList.getAttributeValue("ans"));
//change ans field
quesList.setAttribute("ans", ""+i);
List qList = quesList.getChildren();
for(int a=0;a< qList.size();a++) {
Element ques =(Element) qList.get(a);
if(ques.getAttributeValue("file")!=null){
//read xml
System.out.println(ques.getAttributeValue("file"));
//write xml attribute
//System.out.println(ques.setAttribute("file","dasd"+a));
}
if(ques.getName().equalsIgnoreCase("question")){
//read
System.out.println(ques.getTextTrim());
ques.addContent(new CDATA(ques.getTextTrim()));
}
if (ques.getName().equalsIgnoreCase("options")) {
List optList = ques.getChildren();
for (int k = 0; k < optList.size(); k++) {
Element option = (Element) optList.get(k);
if(option.getName().equalsIgnoreCase("option")){
//read
option.getParentElement().removeChild("option");
}
}
}
if(ques.getName().equalsIgnoreCase("explaination")){
ques.removeContent();
ques.addContent(new CDATA("explaination"+a));
}
}
}
FileOutputStream file=new FileOutputStream(path);
xmlOutput.output(document, file);
}catch (JDOMException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
my output is:
<?xml version="1.0" encoding ="utf-8" ?>
<mcss>
<quest ans="1">
<question><![CDATA[Write 5x= 3y-1 as linear equation form.]]></question>
<options>
</options>
<explaination><![CDATA[Recall the linear equation in two variables form.]]></explaination>
</quest>
</mcss>
but I want like this.
<?xml version="1.0" encoding ="utf-8" ?>
<mcss>
<quest ans="1">
<question><![CDATA[Write 5x= 3y-1 as linear equation form.]]></question>
<options>
<option><![CDATA[5x-3y+1=0]]></option>
<option><![CDATA[-5x-3y-1=0]]></option>
</options>
<explaination><![CDATA[Recall the linear equation in two variables form.]]></explaination>
</quest>
</mcss>
Element.removeChild will remove only the first child with the given name. You can use Element.removeContent(int index) to remove child element by index
or Element.removeContent(Content content) to remove specific element.
You said you want to remove the second option, but in your example third one is removed. I'm slightly confused, so change index if necessary.
just focus on the loop and iterate from last index -1 that i have done in code.