如何通过Java程序对xml文件进行解析

本文介绍了如何使用Java的DOM API解析XML文件,包括DocumentBuilderFactory、DocumentBuilder、XML文件路径读取、节点操作和属性遍历。通过实例展示了获取根节点属性、子节点内容以及通过名称定位节点的过程。
摘要由CSDN通过智能技术生成
package com.baidu;

//如何通过Java程序对xml文件进行解析
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

/*
  1.编写Java程序解析XML文件。
  2.解析XML文件的组件有很多,开源项目有很多,具有代表性的是:
       JDK自带的: org.w3c.dom
       dom4j: dom for java(为java语言专门定制的dom解析XML。)
       jdom
       ....
  3. w3c规范:
       javascript中有这样一行代码: var elt = document.getElementById("id");
       java中的org.w3c.dom包下有Document类,也有这一行代码:Element elt = document.getElementById("id");

       其实:document.getElementById("id") 这个方法规范是W3C制定的。
       然后:
           浏览器的javascript实现了上述的规范
           开发JDK的程序员也对这个上述的规范进行了实现。

       javascript是解析HTML的语言。
       java的JDK的org.w3c.dom包下的类可以解析XML语言。

       html和XML很像。因为他俩是兄弟俩。它们的父亲是SGML。
       SGML是W3C制定的规范。

  4. 掌握怎么使用org.w3c.dom包下的类进行XML文件的解析。
 */
public class Test01 {
    public static void main(String[] args) {
        //创建工厂对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();


        try {
            //通过工厂对象创建文档解析器对象,DOM树建立
            DocumentBuilder db = dbf.newDocumentBuilder();

            //解析xml文件
            //1.获取需要解析的文件路径
            String path = Thread.currentThread().getContextClassLoader().getResource("XML/db.xml").toURI().getPath();

            //2.调用parse方法解析xml文件
            Document document = db.parse(new File(path));

            //3.获取根节点
            Node firstChild = document.getFirstChild();

            //4.获取根节点的属性
            NamedNodeMap firstChildAttributes = firstChild.getAttributes();

            //5.遍历根节点的所有属性
            for (int i = 0; i < firstChildAttributes.getLength(); i++) {
                //通过item方法获取节点
                Node attribute = firstChildAttributes.item(i);
                //获取属性的名字
                String nodeName = attribute.getNodeName();
                //获取属性的值
                String nodeValue = attribute.getNodeValue();
                //打印输出看一下效果
                System.out.println(nodeName +":"+ nodeValue);
            }

            //6.获取根节点的名字
            String firstChildNodeName = firstChild.getNodeName();
            System.out.println("firstChildNodeName = " + firstChildNodeName);

            //7.获取根节点下所有的子节点
            NodeList childNodes = firstChild.getChildNodes();

            //8.遍历根节点下的所有子节点
            for (int i = 0; i < childNodes.getLength(); i++) {
                //通过item方法获取节点
                Node node = childNodes.item(i);
                //获取子节点中的子节点
                NodeList nodes = node.getChildNodes();
                //作非空判断
                if(node.getChildNodes() !=null){
                    //通过循环获取子节点元素的值
                    for (int j = 0; j <nodes.getLength() ; j++) {
                        Node item = nodes.item(j);
                        String nodeName = item.getNodeName();
                        String nodeTextContent = item.getTextContent();

                        switch (nodeName) {
                            case "driver" -> System.out.println("driver = " + nodeTextContent);
                            case "url" -> System.out.println("url = " + nodeTextContent);
                            case "user" -> System.out.println("user = " + nodeTextContent);
                            case "pass" -> System.out.println("pass = " + nodeTextContent);
                            case "initialSize" -> System.out.println("initialSize = " + nodeTextContent);
                            case "minIdle" -> System.out.println("minIdle = " + nodeTextContent);
                            case "maxActive" -> System.out.println("maxActive = " + nodeTextContent);
                            case "maxWait" -> System.out.println("maxWait = " + nodeTextContent);
                        }
                    }
                }
            }

            //9.通过节点的name获取节点List集合,再调用item方法获取节点
            Node driverNode = document.getElementsByTagName("driver").item(0);

            //10.调用getTextContext方法获取节点中的内容
            String driver = driverNode.getTextContent();
            System.out.println("driver = " + driver);

            //11.将通过名称获取节点的内容简化为1步
            String url = document.getElementsByTagName("url").item(0).getTextContent();
            System.out.println("url = " + url);
            String user = document.getElementsByTagName("user").item(0).getTextContent();
            System.out.println("user = " + user);
            String pass = document.getElementsByTagName("pass").item(0).getTextContent();
            System.out.println("pass = " + pass);
        }
        catch (ParserConfigurationException e) {
            System.out.println("文档解析器对象获取失败!");
        }catch (URISyntaxException e) {
            System.out.println("文件路径获取失败!");
        } catch (IOException e) {
            System.out.println("IO异常!");
        } catch (SAXException e) {
            System.out.println("文件解析失败!");
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<properties id="jdbc">
    <property name="mysql">
        <driver>com.mysql.cj.jdbc.Driver</driver>
        <url>jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC</url>
        <user>root</user>
        <pass>root</pass>
    </property>

    <property name="druid">
        <initialSize>10</initialSize>
        <minIdle>10</minIdle>
        <maxActive>20</maxActive>
        <maxWait>6000</maxWait>
    </property>
</properties>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值