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&useSSL=false&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>