DOM和DOM4J

目录

DOM解析XML文件步骤:

保存XML文件:

获取标签和属性:

添加元素到XML中:

修改XML文件的内容:

删除XML文件中标签:

DOM4J

解析XML文件 :

获取标签和属性

保存XML文件

添加标签:

修改XML文件内容

删除标签


DOM解析XML文件步骤:

1.创建解析器工厂对象DocumentBuilderFactory

2.通过解析器工厂对象创建解析器对象

3.通过解析器对象调用方法将XML文件转换Document对象

4.通过Document对象去操作XML文件里的数据

DocumentBuilderFactory ddf = DocumentBuilderFactory.newInstance();
        
        try {
            //第二步通过解析器工厂对象dbf创建解析器对象
            DocumentBuilder db= ddf.newDocumentBuilder();
            //第三步:通过解析器对象调用的方法将XML文件转换为Document对象
            Document document = db.parse("收藏信息.xml");       
            System.out.println(document);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
//定义得到Dcoument方法
    public Document getDocument(String uri){
        Document document=null;
        try {
            //创建解析器工厂对象
            DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
            //通过解析器工厂独享创建解析器对象
            DocumentBuilder db = dbf.newDocumentBuilder();
            document = db.parse(uri);
            
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return document;
        
    }
    //测试类
    
​
    public static void main(String[] args) {
        //创建XmlDocumentDemo02类对象
        XmlDocumentDemo02 xdd = new XmlDocumentDemo02();
        //调用getDocument()方法将"收藏信息.xml"文件转换为Document对象
        Document document = xdd.getDocument("收藏信息.xml");
        
        //获取数据
        NodeList brands =document.getElementsByTagName("Brand");
        for (int i = 0; i < brands.getLength(); i++) {// getLength()列表中的节点数。
            //Node是一个节点口,节点口包括元素节点,属性节点,文本节点等,而现在我们获取的是brand的节点,所以需要类型转换
            Node node = brands.item(i);// 返回集合中的第 index 个项。
            Element brand = (Element)node;
            String value = brand.getAttribute("name");//通过元素节点的属性名称获取属性的值
            System.out.println(value);
        }
​
    }
​
​

保存XML文件:

步骤:1.获得TransformerFactory对象

2.创建Transformer对象

3.创建DOMSource对象:包含XML信息

4.设置输出属性:编码格式

5.创建StreamResult对象:包含保存文件信息

6.将XML保存到指定文件中

//保存XML文件:将java内存中的document对象存储到外部中,需要借助转换器对象实现此功能
    public void savaXML(String path){
        //创建转换器工厂对象
        TransformerFactory factory=TransformerFactory.newInstance();
        //设置首行缩进4个字符      允许用户设置底层实现上的指定属性。
        factory.setAttribute("indent-number", "4");
        try {
            //通过转换器工厂对象创建转换器对象
            Transformer transformer=factory.newTransformer();
            //设置存储格式  设置转换中实际的输出属性。
            transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//          创建transform()方法需要的两个参数对象
            StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
            DOMSource  source=new DOMSource(document);
            /*
             * 通过转换器对象调用方法将java内存中的document对象存储到外部文件中
             * transform(Source source,Result result)两个参数
             * Source表示源头,也就是Java内存中的document对象,而Source是一个接口,不能被直接创建对象,可以使用其实现类DOMSource
             * Result表示结果,也就是java内存中的document对象要存储的位置,而Result是一个接口,不能直接创建对象,可以使用其实现类StreamReault
             */
            transformer.transform(source, result);
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

获取标签和属性:

document.getElementsByTagName("Brand");获取标签节点

getLength():获取节点集合元素个数

brands.item(i);item()方法将元素从集合中取出来

eleBrand.getAttribute("name")调用方法获取属性的值

getChildNodes()获取子节点的方法

getNodeType()获取子节点的类型的值

    //获取手机品牌和属性
    public void showInfo(){
        //从document对象出发,调用方法获取节点,根据标签的名称来获取节点,获取的可能是多个节点,所以得到的是一个节点的集合
        NodeList brands=document.getElementsByTagName("Brand");
        //遍历节点集合,取出里面的元素,getLength():获取节点集合元素个数
        for(int i=0;i<brands.getLength();i++){
            //item()方法:将元素从集合中取出来,取出来的是父类型Node
            Node node=brands.item(i);
            //将父类型向下转型为真正的类型,Brand是一个标签节点,所以向下转型为Element
            Element eleBrand=(Element)node;
            //得到标签节点后,调用方法获取指定属性的属性的值
            System.out.println(eleBrand.getAttribute("name"));
            
            //获取Brand标签的子节点,可能有多个不同类型的子节点,将获取的子节点存储在节点集合中 getChildNodes():获取子节点的方法
            NodeList types=eleBrand.getChildNodes();
            //遍历子节点的集合
            for(int j=0;j<types.getLength();j++){
                //从集合中取出子节点
                Node typeNode=types.item(j);
                //从集合中取出来的子类中类型可能是文本节点,也可能是标签节点,所以在进行类型判断,getNodeType()获取节点的类型值,是一个short值,Node里面给不同类型的节点赋予了一个静态常量值,其中Element类型节点的值为1
                if(typeNode.getNodeType()==Node.ELEMENT_NODE){
                    //将父节点向下转型为子节点类型
                    Element eleType=(Element)typeNode;
                    //通过字节点调用方法获取执行属性的属性值   通过元素节点的属性名称获取属性的值
                    System.out.println(eleType.getAttribute("name"));
                }
            }
        }
    }

添加元素到XML中:

createElement(String tagName)调用此方法创建一个元素的节点

setAttribute(String name,String value)调用此方法设置属性及属性的值

appendChild(Node newChild)将创建好的两个元素节点建立关系

getElementsByTagName(String tagname).item(index).appendChild(Node newChild)获取XML文件中第一个元素节点,将创建好的标签作为子节点追加到获取的第一个元素节点中

this.savaXML(String path)元素添加完毕之后调用保存方法将对象信息存储到xml文件中

    //添加元素到XML文件中
    public void add(){
        //通过document对象调用方法创建一个元素的节点
        Element element=document.createElement("Brand");
        //通过元素节点调用方法给元素节点设置属性及属性值
        element.setAttribute("name", "三星");
        //通过document对象调用方法创建一个元素的节点
        Element ele1=document.createElement("Type");
        //通过元素节点调用方法给元素节点设置属性及属性值
        ele1.setAttribute("name", "Note3");
        //将创建好的两个节点建立关系
        element.appendChild(ele1);
        //获取xml文件中的第一个PhoneInfo元素节点,然后将创建好的brand标签作为子节点追加到获取的第一个PhoneInfo元素节点中
        document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
        //元素添加完毕之后,需要将java内存中的document对象存储到xml文件中
        this.savaXML("new.xml");
    }

修改XML文件的内容:

getElementsByTagName(String tagname)获取你想要修改的元素标签

setAttribute(String name,String value)添加属性

//修改:修改xml文件中的内容
    public void update(){
        //通过document对象获取你想要修改的元素,将获取的元素存储在节点集合中
        NodeList brands=document.getElementsByTagName("Brand");
        //遍历节点集合,修改节点(给节点添加一个属性)
        for(int i=0;i<brands.getLength();i++){
            //取出节点集合中的元素
            Node brand=brands.item(i);
            //将节点元素转换成其真正的类型
            Element eleBrand=(Element)brand;
            //给元素节点添加了一个新的属性
            eleBrand.setAttribute("id", i+"");
        }
        this.savaXML("new.xml");
    }

删除XML文件中标签:

getParentNode():获取父节点

removeChild(元素节点名)删除子节点

//删除XMl文件中一些标签
    public void delete(){
        //通过document对象获取你想要的删除的元素节点,将元素节点存储在节点集合中
        NodeList brands=document.getElementsByTagName("Brand");
        //遍历集合
        for(int i=0;i<brands.getLength();i++){
            //取出节点集合中的元素
            Node brand=brands.item(i);
            //将节点转换成真正的类型
            Element eleBrand=(Element)brand;
            //从遍历的元素节点中找出你要删出的元素节点,通过元素节点的属性值来判断
            if(eleBrand.getAttribute("name").equals("华为")){
                //删除元素,不能自己删除自己,需要通过其父元素来删除 getParentNode():获取父节点 removeChild(元素节点名):删除子节点
                //getParentNode()返回此节点的父节点。
                eleBrand.getParentNode().removeChild(eleBrand);
            }
        }
        this.savaXML("new.xml");
    }

DOM4J

非常优秀的java XML API

性能非常优异,功能强大

开放源代码

Document:定义XML文档

Element:定义XML元素

Text:定义XML文本节点

Attribute:定义了XML的属性

解析XML文件 :

SAXReader saxReader = new SAXReader();创建对象,调用read()方法将XML文件转换成Document对象

.read(File file)得到Document对象

//定义方法:将XML文件转换为Document类对象
    public static void loadDocument(){
        try{
            //创建SAXReader类对象,调用方法read()方法将XML文件转换为Document类对象
            SAXReader saxReader = new SAXReader();
            //利用saxReader.read(File file)方来得到Document对象
            doc = saxReader.read(new File("收藏信息.xml"));
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

获取标签和属性

.getRootElement()获取根节点

.elementIterator()获取根节点所有的子节点(子元素)

attributeValue(属性名:)输出标签的属性

//获取标签和属性
    public static void showPhoneInfo() {
        // 获取XML的根节点
        Element root = doc.getRootElement();
        // 通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器总,然后遍历所有的Brand标签
        for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
            Element brand = (Element) itBrand.next();
            // attributeValue(属性名:)输出标签的属性
            System.out.println("品牌:" + brand.attributeValue("name"));
            // 使用bread节点来调用elementIterator()方法获取bread标签的子标签type,然后遍历Type标签
            for (Iterator itType = brand.elementIterator(); itType.hasNext();) {
                Element type = (Element) itType.next();
                //attributeValue(属性名:)输出标签的属性
                System.out.println("\t型号:" + type.attributeValue("name"));
            }
        }
​
    }

保存XML文件

OutputFormat.createPrettyPrint()来获取存储的格式和编码

setEncoding("GBK")获取XML编码

//保存xml信息
    public static void saveXML(String path){
        try {
            //OutputFormat.createPrettyPrint()来获取存储的格式和编码
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("GBK"); // 指定XML编码
            //写入Xml文档中获取文件的路径和编码
            XMLWriter writer = new XMLWriter(new FileWriter(path), format);
            writer.write(doc);
            writer.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

添加标签:

.addElement(String age0);创建子节点标签

addAttribute(String age0, String age1)创建标签属性

//添加标签
    public static void addNewPhoneInfo(){
        // 获取XML的根节点
        Element root = doc.getRootElement();
        // 利用根节点创建Brand标签
        Element el = root.addElement("Brand");
        // 给Brand标签设置属性
        el.addAttribute("name", "三星");
        // 利用Brand节点创建Type标签
        Element typeEl = el.addElement("Type");
        // 给Type标签设置属性
        typeEl.addAttribute("name", "Note4");
        saveXML("收藏信息.xml");
    }

修改XML文件内容

addAttribute(String age0, String age1)方法传入数据

/修改XML文件的内容
    public static void updatePhoneInfo(){
        // 获取XML的根节点
        Element root = doc.getRootElement();
        int id = 0;//定义准备添加的属性
        //通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器中,然后遍历所有的Brand标签
        for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
            //迭代器中取出
            Element brand = (Element) itBrand.next();
            id++;
            //调用addAttribute()方法传入数据进行修改
            brand.addAttribute("id", id + "");
        }
​
        saveXML("src/收藏信息.xml");
​
    }

删除标签

attributeValue(String age0)得到你要删除的标签

remove(Element age0)删除

//删除标签
    public static void deleteItem(){
        // 获取XML的根节点
        Element root = doc.getRootElement();
        int id = 0;
        //通过根节点调用elementIterator()方法来获取根节点中所有的Brand元素,将获取的brand标签存储到迭代器中,然后开始遍历Brand标签
        for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
            Element brand = (Element) itBrand.next();
            //从brand标签中寻找你要删除的标签attributeValue()方法的到你需要删除的标签
            if (brand.attributeValue("name").equals("华为")) {
                //自己不能删除自己,需要找到其父类元素进行删除
                brand.getParent().remove(brand);
            }
        }
        saveXML("src/收藏信息.xml");            
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值