<?xml version="1.0" encoding="UTF-8" standalone="no"?> <config> <product> <good canAnc="0" canSale="0" id="1" name="联想电脑" price="1200"/> <good canAnc="0" canSale="0" id="2" name="香草巧克力冰淇淋" price="1200"/> <good canAnc="0" canSale="0" id="3" name="巧克力冰淇淋" price="1200"/> <good canAnc="0" canSale="0" id="4" name="意式浓缩咖啡" price="1800"/> </product> </config>
//Test import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.*; public class Test { /** * 读xml文件 * @param args */ public static void main(String[] args) { // 创建一个DocumentBuilderFactory对象 DocumentBuilderFactory xDocumentBuilderFactory = DocumentBuilderFactory.newInstance(); try { // 创建一个DocumentBuilder对象 DocumentBuilder xdocumentBuilder = xDocumentBuilderFactory.newDocumentBuilder(); // 传入要解析的XML文件 Document xDocument = xdocumentBuilder.parse(new File("D:/config.xml")); // 通过标签获得节点集合 NodeList beanList = xDocument.getElementsByTagName("good"); System.out.println("共有" + beanList.getLength() + "个节点"); // 遍历每一个bean节点 for (int i = 0; i < beanList.getLength(); i++) { // 获取其中一个节点 String id = beanList.item(i).getAttributes().item(2).getNodeValue(); String name = beanList.item(i).getAttributes().item(3).getNodeValue(); String price = beanList.item(i).getAttributes().item(4).getNodeValue(); String canSale = beanList.item(i).getAttributes().item(1).getNodeValue(); System.out.println(id + "-" + name + "-" + price + "-" + canSale); //当i=0,即把第一个good的第index=3的属性值修改为联想电脑 if(i==0){ beanList.item(i).getAttributes().item(3).setNodeValue("联想电脑"); } } //修改之后写入本地xml TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(xDocument); StreamResult result = new StreamResult(new File("D:/config.xml")); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.transform(source, result); System.out.println("XML file updated successfully"); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } }
参考https://blog.csdn.net/Rongbo_J/article/details/50240547
参考内容
DOM解析方式也可用于修改XML数据,我们可以使用它完成新增元素、删除元素、修改元素值、修改元素属性等操作。
我们的XML文件,内容如下:
employee.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Employees>
<Employee id="1"> <name>Pankaj</name> <age>29</age> <role>Java Developer</role> <gender>Male</gender> </Employee> <Employee id="2"> <name>Lisa</name> <age>35</age> <role>CSS Developer</role> <gender>Female</gender> </Employee> </Employees>
我们将修改XML文件的内容:
1.根据员工的性别(gender)修改”id”属性值,性别为男(Male)的id属性值中追加”M”,为女(Female)的id属性值追加”F”。
2.修改name元素的值,全部变成大写。
3.”gender”元素已经没有存在的意义了,我们删除它。
4.在employee节点下新增一个”salary”节点。
当我们完成上述操作后,将内容保存在一个新的xml文件中。
下面是使用DOM方式解析的Java程序代码:
ModifyXMLDOM.java
package com.journaldev.xml;
import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class ModifyXMLDOM { public static void main(String[] args) { String filePath = "employee.xml"; File xmlFile = new File(filePath); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder; try { dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(xmlFile); doc.getDocumentElement().normalize(); //update attribute value updateAttributeValue(doc); //update Element value updateElementValue(doc); //delete element deleteElement(doc); //add new element addElement(doc); //write the updated document to file or console doc.getDocumentElement().normalize(); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File("employee_updated.xml")); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.transform(source, result); System.out.println("XML file updated successfully"); } catch (SAXException | ParserConfigurationException | IOException | TransformerException e1) { e1.printStackTrace(); } } private static void addElement(Document doc) { NodeList employees = doc.getElementsByTagName("Employee"); Element emp = null; //loop for each employee for(int i=0; i<employees.getLength();i++){ emp = (Element) employees.item(i); Element salaryElement = doc.createElement("salary"); salaryElement.appendChild(doc.createTextNode("10000")); emp.appendChild(salaryElement); } } private static void deleteElement(Document doc) { NodeList employees = doc.getElementsByTagName("Employee"); Element emp = null; //loop for each employee for(int i=0; i<employees.getLength();i++){ emp = (Element) employees.item(i); Node genderNode = emp.getElementsByTagName("gender").item(0); emp.removeChild(genderNode); } } private static void updateElementValue(Document doc) { NodeList employees = doc.getElementsByTagName("Employee"); Element emp = null; //loop for each employee for(int i=0; i<employees.getLength();i++){ emp = (Element) employees.item(i); Node name = emp.getElementsByTagName("name").item(0).getFirstChild(); name.setNodeValue(name.getNodeValue().toUpperCase()); } } private static void updateAttributeValue(Document doc) { NodeList employees = doc.getElementsByTagName("Employee"); Element emp = null; //loop for each employee for(int i=0; i<employees.getLength();i++){ emp = (Element) employees.item(i); String gender = emp.getElementsByTagName("gender").item(0).getFirstChild().getNodeValue(); if(gender.equalsIgnoreCase("male")){ //prefix id attribute with M emp.setAttribute("id", "M"+emp.getAttribute("id")); }else{ //prefix id attribute with F emp.setAttribute("id", "F"+emp.getAttribute("id")); } } } }
输出xml文件内容:
employee_updated.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Employees>
<Employee id="M1"> <name>PANKAJ</name> <age>29</age> <role>Java Developer</role> <salary>10000</salary> </Employee> <Employee id="F2"> <name>LISA</name> <age>35</age> <role>CSS Developer</role> <salary>10000</salary> </Employee> </Employees>