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写入、读取方法,现在修改写得较少

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值