JAVA 解析XML之DOM方式

java解析XML文件有四种方法,java官方提供两种解析方式DOM和SAX解析XML其他组织在DOM的基础上有增加了JDOM和DOM4J的方式解析

首先了解DOM解析和生成XML方式,根据当前节点名称获取所有的节点,然后循环获取当前节点的子节点。

创建一个department.xml文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<department>
     <employee id="1" name="gong">
        <name>jason</name>
        <sex>1</sex>
        <age>24</age>
     </employee>

     <employee id="2">
        <name>king</name>
        <sex>1</sex>
        <age>18</age>
     </employee>
</department>
public class DOM_Parse {

    /**
     * 利用DOM方式对xml进行解析
     * 
     * */

    public static void main(String[] args) {

            parseXML();
        createXML();
    }

    // 创建XMl文件
    public static void createXML() {

        // 创建DocumentBuilderFactory对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 用factory创建DocumentBuilder对象
        DocumentBuilder db;
        try {
            db = factory.newDocumentBuilder();
            // 通过DocumentBuilder对象的创建一个新的Document
            Document document = db.newDocument();
            // 创建一个根节点
            Element depNode = document.createElement("department");
            // 把根节点添加到document中
            document.appendChild(depNode);
            // 创建一个employee子节点
            Element empNode = document.createElement("employee");
            // 设置子节点的属性
            empNode.setAttribute("id", "1");
            // 把子节点添加到根节点中
            depNode.appendChild(empNode);

            // 创建employee节点的子节点name
            Element name = document.createElement("name");
            name.setTextContent("gong");
            // 创建employee节点的子节点age
            Element age = document.createElement("age");
            age.setTextContent("12");
            // 创建employee节点的子节点sex
            Element sex = document.createElement("sex");
            sex.setTextContent("女");

            empNode.appendChild(name);
            empNode.appendChild(age);
            empNode.appendChild(sex);

            // 创建TransformerFactory对象
            TransformerFactory tff = TransformerFactory.newInstance();

            // 创建Transformer对象
            Transformer tf = tff.newTransformer();
            // tf.transform(xmlSource, outputTarget);
            tf.transform(new DOMSource(document), new StreamResult(new File(
                    "dep.xml")));

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

    }

    // 解析XML
    public static void parseXML() {

        // 创建DocumentBuilderFactory对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        try {

            // 用factory创建DocumentBuilder对象
            DocumentBuilder db = factory.newDocumentBuilder();
            // 通过DocumentBuilder对象的parse()方法加载xml文件
            Document document = db.parse("department.xml");

            /*
             * 可指定xml文件 File file=new
             * File("C:/Users/GONG/Desktop/department.xml"); Document
             * document=db.parse(File);
             */

            // 得到所有employee标签
            NodeList empList = document.getElementsByTagName("employee");
            System.out.println("有" + empList.getLength() + "个employee");
            // 遍历所有节点
            for (int i = 0; i < empList.getLength(); i++) {
                // 获取employee节点,item索引从0开始
                Node emp = empList.item(i);
                // 获取employee的属性集合
                NamedNodeMap attrs = emp.getAttributes();
                System.out.println("当前是第" + (i + 1) + "个节点");
                // 遍历employee的属性
                for (int j = 0; j < attrs.getLength(); j++) {
                    Node node = attrs.item(j);
                    System.out.print("属性名:" + node.getNodeName() + " 属性值: "
                            + node.getTextContent() + ",");
                }
                System.out.println();

                // 获取emp所有子节点元素
                NodeList childnodeList = emp.getChildNodes();
                System.out
                        .println("当前emp点有" + childnodeList.getLength() + "元素");
                // 遍历emp中的子节点元素
                for (int k = 0; k < childnodeList.getLength(); k++) {
                    Node childElement = childnodeList.item(k);
                    // 区分出text类型的node以及element类型的节点
                    if (childElement.getNodeType() == Node.ELEMENT_NODE) {
                        System.out.println("节点名:" + childElement.getNodeName()
                                + " 节点值:"
                                + childElement.getFirstChild().getNodeValue()
                                + ",");
                    }

                }

            }

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值