xml三步曲之三:java修改xml文件的三種形式:DOM JDOM DOM4J

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寫入、讀取方法,現在修改寫得較少

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章