使用DOM解析XML文件,读取xml文件,保存xml,增加节点,修改节点属性,删除节点

<?xml version="1.0" encoding="GB2312" ?>
<PhoneInfo>
<Brand name="华为">
    <Type name="P9"/>
</Brand>
<Brand name="苹果">
    <Type name="iphone5"/>
    <Type name="iphone6"/>
</Brand>
</PhoneInfo>

0、整体代码

package test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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.Result;
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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XmlTest {

    Document doc = null;// 创建一个Document对象

    public static void main(String[] args) {
        XmlTest xml = new XmlTest();
        xml.getDocument();
        xml.creatNode();
        xml.changeType();
        xml.showInfo();
        xml.deleteNode("SAMSUNG");
        xml.showInfo();
        xml.saveXml("D:/xml.xml");

    }

    /**
     * 获得DOM树 
     * 
     */
    public void getDocument() {
        // 1、得到DOM工厂解析器工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        try {
            // 2、从DOM工厂中获得Dom解析器
            DocumentBuilder db = factory.newDocumentBuilder();
            // 3、解析XML文件获得Document对象,即DOM树
            doc = db.parse("收藏信息.xml");
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /**
     * 显示xml文档信息 !
     */
    public void showInfo() {
        // 获取DOM树Brand节点
        NodeList BrandName = doc.getElementsByTagName("Brand");
        for (int i = 0; i < BrandName.getLength(); i  ) {
            // 获取第i个Brand元素的信息(返回i元素)
            Node brand = BrandName.item(i);
            // Element是Node的子类,用Element的getAttribute("属性名")获得元素属性
            Element element = (Element) brand;
            // 获取第i个Brand元素的name属性
            String brandAttribute = element.getAttribute("name");
            // 获得所有的子节点
            NodeList types = element.getChildNodes();
            for (int j = 0; j < types.getLength(); j  ) {
                Node type = types.item(j);
                // 判断是否是元素节点(使用getChildNodes()就要判断)
                if (type.getNodeType() == Node.ELEMENT_NODE) {
                    Element typeEle = (Element) type;
                    String typeAttribute = typeEle.getAttribute("name");
                    System.out.println("手机:"   brandAttribute   typeAttribute);
                }
            }

        }
    }

    /**
     * 新增节点
     * 
     */
    public void creatNode() {
        // 创建三星节点
        Element brandEle = doc.createElement("Brand");
        brandEle.setAttribute("name", "三星");
        // 创建型号Note7节点
        Element type = doc.createElement("Type");
        type.setAttribute("name", "Note7");
        // 把note7元素挂到三星元素上
        brandEle.appendChild(type);
        // 找到PhoneInfo节点
        NodeList PhoneInfosNode = doc.getElementsByTagName("PhoneInfo");
        for (int i = 0; i < PhoneInfosNode.getLength(); i  ) {
            Node PhoneInfos = PhoneInfosNode.item(i);
            if (PhoneInfos.getNodeType() == Node.ELEMENT_NODE) {
                // 把三星节点挂到PhoneInfo上
                PhoneInfos.appendChild(brandEle);
            }

        }

    }
    /**
     * 保存xml文档
     *
     * @param path 保存的路径
     */
    public void saveXml(String path) {
        // 1、创建转换工厂
        TransformerFactory factory = TransformerFactory.newInstance();

        try {
            // 2、从工厂中获得转换器
            Transformer Transformer = factory.newTransformer();
            // 3、进行转换,如果直接转换可能出现乱码,需要进行格式设置
            // 输出文件编码格式设置
            Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
            // 需要DOM转换的源文件
            DOMSource xmlSource = new DOMSource(doc);
            // 指定目标路径
            StreamResult outputTarget = new StreamResult(new FileOutputStream(
                    path));
            // 使用transform()进行保存xml文件
            Transformer.transform(xmlSource, outputTarget);

        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    /**
     * 更改Brand属性
     *
     */
    public void changeType(){
        //获得节点信息
        NodeList brandElements = doc.getElementsByTagName("Brand");
        //遍历节点
        for (int i = 0; i < brandElements.getLength(); i  ) {
            Node brands = brandElements.item(i);
            Element brand=(Element) brands;
            
            String brandAtt = brand.getAttribute("name");
            //判断节点属性值
            if(brandAtt.equals("三星")){
                brand.setAttribute("name", "SAMSUNG");
            }
        }
    }
    /**
     * 删除指定节点
     * @param name 删除的Brand属性名
     */
    public void deleteNode(String name){
        NodeList brandsEle = doc.getElementsByTagName("Brand");
        for (int i = 0; i < brandsEle.getLength(); i  ) {
            Element brand = (Element) brandsEle.item(i);
            String brandAttribute = brand.getAttribute("name");
            if(brandAttribute.equals(name)){
                doc.getElementsByTagName("PhoneInfo").item(0).removeChild(brand);
            }
            
        }
    }
}

 1、通过DocumentBuilderFactory 获得解析工厂,在工厂中获得解析器实例,通过解析器获得DOM树。

    /**
     * 获得DOM树 
     * 
     */
    public void getDocument() {
        // 1、得到DOM工厂解析器工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        try {
            // 2、从DOM工厂中获得Dom解析器
            DocumentBuilder db = factory.newDocumentBuilder();
            // 3、解析XML文件获得Document对象,即DOM树
            doc = db.parse("收藏信息.xml");
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

 

2、保存xml文件

/**
     * 保存xml文档
     *
     * @param path 保存的路径
     */
    public void saveXml(String path) {
        // 1、创建转换工厂
        TransformerFactory factory = TransformerFactory.newInstance();

        try {
            // 2、从工厂中获得转换器
            Transformer Transformer = factory.newTransformer();
            // 3、进行转换,如果直接转换可能出现乱码,需要进行格式设置
            // 输出文件编码格式设置
            Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
            // 需要DOM转换的源文件
            DOMSource xmlSource = new DOMSource(doc);
            // 指定目标路径
            StreamResult outputTarget = new StreamResult(new FileOutputStream(
                    path));
            // 使用transform()进行保存xml文件
            Transformer.transform(xmlSource, outputTarget);

        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

3、xml文件显示到控制台

/**
     * 显示xml文档信息 !
     */
    public void showInfo() {
        // 获取DOM树Brand节点
        NodeList BrandName = doc.getElementsByTagName("Brand");
        for (int i = 0; i < BrandName.getLength(); i  ) {
            // 获取第i个Brand元素的信息(返回i元素)
            Node brand = BrandName.item(i);
            // Element是Node的子类,用Element的getAttribute("属性名")获得元素属性
            Element element = (Element) brand;
            // 获取第i个Brand元素的name属性
            String brandAttribute = element.getAttribute("name");
            // 获得所有的子节点
            NodeList types = element.getChildNodes();
            for (int j = 0; j < types.getLength(); j  ) {
                Node type = types.item(j);
                // 判断是否是元素节点(使用getChildNodes()就要判断)
                if (type.getNodeType() == Node.ELEMENT_NODE) {
                    Element typeEle = (Element) type;
                    String typeAttribute = typeEle.getAttribute("name");
                    System.out.println("手机:"   brandAttribute   typeAttribute);
                }
            }

        }
    }

4、添加节点Brand:三星,Type:note7

/**
     * 新增节点
     * 
     */
    public void creatNode() {
        // 创建三星节点
        Element brandEle = doc.createElement("Brand");
        brandEle.setAttribute("name", "三星");
        // 创建型号Note7节点
        Element type = doc.createElement("Type");
        type.setAttribute("name", "Note7");
        // 把note7元素挂到三星元素上
        brandEle.appendChild(type);
        // 找到PhoneInfo节点
        NodeList PhoneInfosNode = doc.getElementsByTagName("PhoneInfo");
        for (int i = 0; i < PhoneInfosNode.getLength(); i  ) {
            Node PhoneInfos = PhoneInfosNode.item(i);
            if (PhoneInfos.getNodeType() == Node.ELEMENT_NODE) {
                // 把三星节点挂到PhoneInfo上
                PhoneInfos.appendChild(brandEle);
            }

        }

    }

5、修改节点属性,修改"三星"为"SAMSUNG"

/**
     * 更改Brand属性
     *
     */
    public void changeType(){
        //获得节点信息
        NodeList brandElements = doc.getElementsByTagName("Brand");
        //遍历节点
        for (int i = 0; i < brandElements.getLength(); i  ) {
            Node brands = brandElements.item(i);
            Element brand=(Element) brands;
            
            String brandAtt = brand.getAttribute("name");
            //判断节点属性值
            if(brandAtt.equals("三星")){
                brand.setAttribute("name", "SAMSUNG");
            }
        }
    }

6、删除SAMSUNG节点

/**
     * 删除指定节点
     * @param name 删除的Brand属性名
     */
    public void deleteNode(String name){
        NodeList brandsEle = doc.getElementsByTagName("Brand");
        for (int i = 0; i < brandsEle.getLength(); i  ) {
            Element brand = (Element) brandsEle.item(i);
            String brandAttribute = brand.getAttribute("name");
            if(brandAttribute.equals(name)){
                doc.getElementsByTagName("PhoneInfo").item(0).removeChild(brand);
            }
            
        }
    }

7、主方法

public static void main(String[] args) {
        XmlTest xml = new XmlTest();
        xml.getDocument();
        xml.creatNode();
        xml.changeType();
        xml.showInfo();
        xml.deleteNode("SAMSUNG");
        xml.showInfo();
        xml.saveXml("D:/xml.xml");

    }

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果需要源码可以发送邮件到sdiwen1982@sohu.com索取 /*************************************** 功能:读取xml文件 参数:[in] xml文件路径 返回:true读取成功 false读取失败 **************************************/ bool ReadXml(CString sXmlPath /*xml文件路径*/); /*************************************** 功能:写入xml文件 参数:[in] xml文件路径 返回:true写入成功 false写入失败 **************************************/ bool WriteXml(CString sXmlPath /*xml文件路径*/); /*************************************** 功能:释放空间 参数:无 返回:无 **************************************/ void Release(); /*************************************** 功能:删除指定的节点 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteNode(); /*************************************** 功能:删除当前节点的所有子节点,当前节点删除 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteAllSon(); /*************************************** 功能:根据索引删除节点 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteSonByIndex(unsigned int nIndex); /*************************************** 功能:删除节点所有属性 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteAllAttr(); /*************************************** 功能:根据属性删除属性 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteAttrByName(CString sName); /*************************************** 功能:根据索引删除属性 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteAttrByIndex(unsigned int nIndex); /*************************************** 功能:根据属性名设置属性值 参数:[in] sName 属性名 [in] sValue 属性值 返回:true设置成功 false设置失败 **************************************/ bool SetAttrValueByName(CString sName, CString sValue); /*************************************** 功能:插入属性 参数:[in] sName 属性名 [in] sValue 属性值 返回:true插入成功 false插入失败 **************************************/ bool InsertAttr(CString sName, CString sValue); /*************************************** 功能:设置节点值 参数:[in] sValue 属性值 返回:true设置节点值成功 false设置节点值失败 **************************************/ bool SetNodeValue(CString sValue); /*************************************** 功能:插入子节点 参数:[in] sName 节点名 返回:非空表示插入节点成功,返回插入的新节点指针 空表示插入失败 **************************************/ CXMLNode * InsertNode(CString sName); /*************************************** 功能:判断是否存在子节点 参数:[in] pNode 子节点文件指针, 返回:false没有子节点 true有子节点 **************************************/ bool HasChild(MSXML2::IXMLDOMNodePtr pNode);

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值