SAX是基于事件流驱动,只能进行一次性写入或读取,无法进行修改操作
修改前xml如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<company>
<apartment id="1">
<staff id="001">
<name>001老大</name>
<age>40</age>
</staff>
</apartment>
<apartment id="2">
<staff id="002">
<name>002老大</name>
<age>50</age>
</staff>
</apartment>
</company>
方法1:DOM方法
package xml.modify;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileOutputStream;
public class ModifyXMLByDOM {
public void modifyXMLByDOM() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document company = builder.parse(new File("company.xml"));
company.getDocumentElement().normalize();
//将xml文件加载到整个内存后,就可以对其进行增添改操作
//增加staff的子节点,加salary;删除一个节点,age
NodeList staffs = company.getElementsByTagName("staff");
for (int i = 0; i < staffs.getLength(); i++) {
//增加
Element staff = (Element) staffs.item(i);
Element salary = company.createElement("salary");
salary.appendChild(company.createTextNode("10000"));
staff.appendChild(salary);
//删除
Node ageNode = staff.getElementsByTagName("age").item(0);
staff.removeChild(ageNode);
//修改
Node nameNode = staff.getElementsByTagName("name").item(0).getFirstChild();
nameNode.setNodeValue(nameNode.getNodeValue()+"员工");
//写入到文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT,"yes");
transformer.transform(new DOMSource(company), new StreamResult(new File("company-new.xml")));
}
}
public static void main(String[] args) throws Exception{
new ModifyXMLByDOM().modifyXMLByDOM();
}
}
修改后xml如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<company>
<apartment id="1">
<staff id="001">
<name>001老大员工</name>
<salary>10000</salary>
</staff>
</apartment>
<apartment id="2">
<staff id="002">
<name>002老大员工</name>
<salary>10000</salary>
</staff>
</apartment>
</company>
方法2:JDOM
package xml.modify;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.io.FileWriter;
import java.util.List;
public class ModifyXMLByJDOM {
public void modifyXMLByJDOM() throws Exception {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build("company.xml");
Element company = doc.getRootElement();
List<Element> apartments = company.getChildren("apartment");
for (Element apartment : apartments) {
List<Element> staffs = apartment.getChildren("staff");
for (Element staff : staffs) {
if (staff.getAttributeValue("id").equals("001")) {//只改id为001的员工信息
Element name = staff.getChild("name");
name.setText("001老大更新");
}
}
}
FileWriter fileWriter = new FileWriter("company-new.xml");
XMLOutputter xmlOutputter = new XMLOutputter();
xmlOutputter.setFormat(Format.getPrettyFormat());
xmlOutputter.output(doc, fileWriter);
}
public static void main(String[] args) throws Exception {
new ModifyXMLByJDOM().modifyXMLByJDOM();
}
}
效果如下:
<?xml version="1.0" encoding="UTF-8"?>
<company>
<apartment id="1">
<staff id="001">
<name>001老大更新</name>
<age>40</age>
</staff>
</apartment>
<apartment id="2">
<staff id="002">
<name>002老大</name>
<age>50</age>
</staff>
</apartment>
</company>
方法3:DOM4J方法
package xml.modify;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
public class ModifyXMLByDOM4J {
public void modifyXMLByDOM4J() throws Exception {
Document doc = new SAXReader().read("company.xml");
Element company = doc.getRootElement();
Iterator<Element> iterator = company.elementIterator();
while (iterator.hasNext()) {
Element apartment = iterator.next();
if (apartment.attributeValue("id").equals("1")) {
List<Element> staffs = apartment.elements("staff");
for (Element staff : staffs) {
Element name = staff.element("name");
name.setText(name.getText() + "new");
}
}
}
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("company-new.xml")),OutputFormat.createPrettyPrint());
xmlWriter.write(doc);
xmlWriter.close();
}
public static void main(String[] args) throws Exception{
new ModifyXMLByDOM4J().modifyXMLByDOM4J();
}
}
效果如下:
<?xml version="1.0" encoding="UTF-8"?>
<company>
<apartment id="1">
<staff id="001">
<name>001老大new</name>
<age>40</age>
</staff>
</apartment>
<apartment id="2">
<staff id="002">
<name>002老大</name>
<age>50</age>
</staff>
</apartment>
</company>
因为前期已经写过xml写入、读取方法,现在修改写得较少