XML文件解析--DOM&DOM4J

XML文件解析–DOM&DOM4J

在这里插入图片描述

一.DOM

前提:获取Document

1.创造解析器工厂对象
DocumentBuilderFactory【类】. newInstance( )【方法】
2.解析器工厂对象创造解析器对象
工厂.newDocumentBuilder( ) 【方法】
3.解析器对象解析XML文件,创建Document对象
解析器.parse(“photoInfo.xml”) 【方法】

查看XML文件信息

1.(通过节点名字)收集Brand节点集合
NodeList brands = dcm.getElementsByTagName(“Brand”);【返回节点集合】
2.遍历brands,从中拿到每个Brand
for循环中:brands.item(i);【获取每个节点】
将节点强转为元素 Element elsBrand=(Element)node;
获得元素的属性 String brandName = elsBrand.getAttribute(“name”); 【返回值为字符串】
寻找子节点
获取每个节点的子节点集合
NodeList typys = elsBrand.getChildNodes(); //通过节点对象的getChildNodes()方法
for循环中:brands.item(i);【获取每个节点】
Node typenode=typys.item(j)
判断子节点是否为元素节点
if判断typenode.getNodeType()==Node.ELEMENT_NODE
将节点强转为元素 Element eltype=(Element)typenode

增加元素

1.创建Brand
Element brand=dcm.createElement(“Brand”);
2.为Brand设置属性name
brand.setAttribute(“name”, “三星”)
3.设置子元素
(1).创建type
Element type=dcm.createElement(“type”);
(2).为Brand设置属性name
type.setAttribute(“name”, “XR”);
4.将子元素type放在Brand中
brand.appendChild(type);
5.将brand放在dcm
获取上一级元素,再放入
dcm.getElementsByTagName(“photoinfo”).item(0).appendChild(brand);
6.保存在XML中(调用保存方法)

添加到XlM文件中(借助转换器:源(最新的Document)–>目的地;借助输出流)

1.创建转换器工厂
TransformerFactory fac=TransformerFactory.newInstance();
(2)设置缩进
fac.setAttribute(“indent-number”, 4); //设置退4格
2.创建转换器
Transformer transformar=fac.newTransformer();
(2)设置转换格式
transformar.setOutputProperty(OutputKeys.ENCODING,“UTF-8”); //关键字转换设定
transformar.setOutputProperty(OutputKeys.INDENT,“YES”); //退格设置
3.源(最新的Document)–>目的地;借助输出流)
transformar.transform(source,ru); //前提需要DOMSource类的源,StreamResult类的地址
(2)DOMSource类的源
DOMSource source=new DOMSource(dcm); //将DOM树转换为DOMSource类
(3)StreamResult类的地址
OutputStream out = new FileOutputStream(path); //字节输出流
StreamResult ru = new StreamResult(new OutputStreamWriter(out,“UTF-8”));

修改元素

1.(通过节点名字)收集Brand节点集合
NodeList brands = dcm.getElementsByTagName(“Brand”);【返回节点集合】
2.遍历brands,从中拿到每个Brand
for循环中:brands.item(i);【获取每个节点】
将节点强转为元素 Element elsBrand=(Element)node;
设置元素新属性
elbrand.setAttribute(“id”, i+"");
3.保存在XML中(调用保存方法)

删除元素

1.(通过节点名字)收集Brand节点集合
NodeList brands = dcm.getElementsByTagName(“Brand”);【返回节点集合】
2.遍历brands,从中拿到每个Brand
for循环中:brands.item(i);【获取每个节点】
将节点强转为元素 Element elsBrand=(Element)node;
if判断元素的属性是否为寻找的元素属性一致
元素的父节点删除该元素
elbrand.getParentNode().removeChild(elbrand);
3.保存在XML中(调用保存方法)

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

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.TransformerConfigurationException;
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;

//使用DOM解析XML文件
public class paresXMLDemo {
    //属性xml对应的Document(方便后续操作)
    private Document dcm;
//    private Node item;
    //获取Document
    public void getdom() {
        //1.创造解析器工厂对象
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        //2.解析器工厂对象创造解析器对象
        try {
            DocumentBuilder builder=factory.newDocumentBuilder();
            //3.解析器对象解析XML文件,创建Document对象
                dcm=builder.parse("photoInfo.xml");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //获取手机的品牌和型号信息
    public void showInfo() {
        //Document起点,(通过节点名字)收集Brand节点集合
        NodeList brands = dcm.getElementsByTagName("Brand");    
        //遍历brands,从中拿到每个Brand
        for (int i = 0; i < brands.getLength(); i++) {
            Node node = brands.item(i);        //NodeList特有方法
            Element elsBrand=(Element)node;        //将节点转换为元素
            String brandName = elsBrand.getAttribute("name");    //获得元素的属性
            System.out.println(brandName);
            
            //继续查找每个Brand的子节点
            NodeList typys = elsBrand.getChildNodes();    
            for (int j = 0; j < typys.getLength(); j++) {
                Node typenode=typys.item(j);
                //判断该子节点是否为元素节点
                if(typenode.getNodeType()==Node.ELEMENT_NODE) {
                    Element eltype=(Element)typenode;
                    System.out.println("\t"+eltype.getAttribute("name"));
                }
            }
        }
    }
    //增加元素
    public void addElement() {
        //1.创建Brand
        Element brand=dcm.createElement("Brand");
        //2.为Brand设置属性name
        brand.setAttribute("name", "三星");
        //设置子元素
        Element type=dcm.createElement("type");
        type.setAttribute("name", "XR");
    //将子元素type放在Brand中
        brand.appendChild(type);
    //将brand放在dcm
        dcm.getElementsByTagName("photoinfo").item(0).appendChild(brand);
        
        //保存在XML中
        saveXML("photoInfo.xml");
    }
    
    //添加到XlM文件中(借助转换器:源(最新的Document)-->目的地;借助输出流)
    public void saveXML(String path) {
        //转换器工厂
        TransformerFactory fac=TransformerFactory.newInstance();
        //设置缩进
        fac.setAttribute("indent-number", 4);
        //转换器
        try {
            Transformer transformar=fac.newTransformer();
            //设置转换格式
            transformar.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
            transformar.setOutputProperty(OutputKeys.INDENT,"YES");
            //源(最新的Document)-->目的地;借助输出流
            DOMSource source=new DOMSource(dcm);
            
            OutputStream out = new FileOutputStream(path);
            
            StreamResult ru = new StreamResult(new OutputStreamWriter(out,"UTF-8"));
            
            transformar.transform(source,ru);
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    
    //修改元素
    public void updateEle() {
        //获取所有的Brand
        NodeList brands=dcm.getElementsByTagName("Brand");
        for (int i = 0; i < brands.getLength(); i++) {
            Node brand=brands.item(i);
            Element elbrand=(Element)brand;
            elbrand.setAttribute("id", i+"");            
        }
        saveXML("photoInfo.xml");
    }
    
    //删除元素
    public void deleteEle() {
        //获取所有的Brand
        NodeList brands=dcm.getElementsByTagName("Brand");
        for (int i = 0; i < brands.getLength(); i++) {
            Node brand=brands.item(i);
            Element elbrand=(Element)brand;
            if(elbrand.getAttribute("name").equals("华为")) {
                elbrand.getParentNode().removeChild(elbrand);
            }            
        }
        saveXML("photoInfo.xml");
        
    }
    
    public static void main(String[] args) {
        paresXMLDemo pd=new paresXMLDemo();
        pd.getdom();
        pd.deleteEle();
        pd.addElement();
        pd.updateEle();
        pd.showInfo();
    }
}

二.DOM4J

要导入DOM4J的jar包

前提:获取Document

1.获取解析器
SAXReader saxReader=new SAXReader();
2.解析文件
dcm=saxReader.read(“photoInfo.xml”) //read方法

查看手机信息

1.获取根元素
Element root = dcm.getRootElement();
2.获取子元素的
(1)获取子元素的迭代器
(2)获取每一个子元素
(3)获取<孙元素>
迭代器
获取每一个

增加一个元素

1.获取根元素
Element root = dcm.getRootElement();
2.创建并传入子元素
(1)Element elebrand=root.addElement(“brand”);
(2)设置子元素属性
elebrand.addAttribute(“name”, “华为”);
3.创建并传入孙元素
(1)Element eletype=elebrand.addElement(“type”);
(2)设置孙元素属性
eletype.addAttribute(“name”, “HW123”);
4.调用保存方法

保存到XML文件中

1.创建转换器
(1).OutputFormat format=OutputFormat.createPrettyPrint();
(2).设置编码格式
format.setEncoding(“UTF-8”);
2.输出
(1).创造输出的“流”
XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream(path),“UTF-8”),format);
(2).将DOM树输出
writer.write(dcm);
3.关流

修改元素

1.获取根元素
Element root = dcm.getRootElement();
2.获取子元素的
(1)获取子元素的迭代器
(2)获取每一个子元素
(3)设置元素属性
brand.addAttribute(“id”, id+" ");
3.调用保存方法

删除节点

1.获取根元素
Element root = dcm.getRootElement();
2.获取子元素的
(1)获取子元素的迭代器
(2)获取每一个子元素
(3)if判断元素的属性是否为寻找的元素属性一致
brand.attributeValue(“name”).equals(“三星”)
元素的父节点删除该元素
brand.getParent().remove(brand);
3.调用保存方法

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class DOM4Jdome {
    private Document dcm;
    //获得Document对象
    public void getdcm() {
        //相当于获取解析器
        SAXReader saxReader=new SAXReader();
        try {
            //解析XML文件
            dcm=saxReader.read("photoInfo.xml");
            
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    
    //显示手机信息
    public void showInfo() {
        //获取XML的根节点<photoInfo>
        Element root = dcm.getRootElement();
        //获取所有的子元素<Brand>
        Iterator elebrand = root.elementIterator();
        while(elebrand.hasNext()) {
            Element brand=(Element)elebrand.next();
            System.out.println(brand.attributeValue("name"));
            
            //获得子元素<type>
            Iterator eletype = brand.elementIterator();
            while(eletype.hasNext()) {
                Element type=(Element)eletype.next();
                System.out.println("\t"+type.attributeValue("name"));
            }
        }
    }
    
    //增加一个元素
    private void addEle() {
        //获得根元素
        Element root = dcm.getRootElement();
        //创建<brand>
        Element elebrand=root.addElement("brand");
        elebrand.addAttribute("name", "华为");
        //创建<type>
        Element eletype=elebrand.addElement("type");
        eletype.addAttribute("name", "HW123");
        saveXML("photoInfo.xml");
    }
    
    //保存到XML中
    private void saveXML(String path) {
        //相当于转换器
        OutputFormat format=OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        XMLWriter writer=null;
        try {
            writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream(path),"UTF-8"),format);
            writer.write(dcm);
            
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        };
    }
    
    //修改节点
    private void updateinfo() {
        Element root=dcm.getRootElement();
        Iterator elebrand = root.elementIterator();
        int id=0;
        while(elebrand.hasNext()) {
            Element brand=(Element)elebrand.next();
            id++;
            brand.addAttribute("id", id+" ");
        }
        saveXML("photoInfo.xml");
    }
    
    //删除节点
    private void deletele() {
        Element root = dcm.getRootElement();
        Iterator elebrand = root.elementIterator();
        while(elebrand.hasNext()) {
            Element brand=(Element)elebrand.next();
            if(brand.attributeValue("name").equals("三星")) {
                brand.getParent().remove(brand);
            }
        }
        saveXML("photoInfo.xml");
    }
    
    public static void main(String[] args) {
        DOM4Jdome dp=new DOM4Jdome();
        dp.getdcm();
        dp.showInfo();
        dp.addEle();
        dp.updateinfo();
        dp.deletele();
        dp.showInfo();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abner G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值