一种语言...
可以用来存储数据、作配置文件用,也可以在网络上传输。现在一般就是做配置文件了。
<User> <name>张三</name> </User>
语法
<?xml version="1.0" encoding="UTF-8" ?> <!--通常来说必须要有文档说明 version是版本信息, encoding是编码 文档说明必须在第一行--> <!--标签定义不能有空格和冒号,区分大小写--> <!--xml中只能有一个根元素--> <!--123是属性,只能在左半标签里。属性值必须使用单引号或者双引号包裹--> <User id="123" number="000"> <!-- 标签里夹的是文本--> <name>张三</name> <age>18</age> <!-- 自闭合(空标签)--> <close/> </User>
约束
防止XML太随意而诞生的规则。
DTD语法简介
引入方法: 在文档声明下面加一行这个
<!DOCTYPE students SYSTEM "student.dtd">
一个简单的dtd约束文件例子
<!ELEMENT students (student+) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED> <!-- ELEMENT: 用来定义元素 students (student+) : 代表根元素 必须是 <students> student+ : 根标签中至少有一个 student子元素, + 代表至少一个 student (name,age,sex): student 标签中包含的子元素,按顺序出现 #PCDATA: 是普通文本内容 ATTLIST: 用来定义属性 student number ID #REQUIRED student子元素中 有一个ID属性叫做 number,是必须填写的 ID: 唯一 值只能是字母或者下划线开头 -->
schema
比DTD支持的约束更多,文件后缀名.xsd。太复杂了,也没人自己写,不贴了。
XML解析
通常有两种方式。一种是DOM,一种是SAX
DOM方式就是把整个DOM全读取到内存,形成一颗dom树。
优点是有结构关系,缺点是文件大会把内存***。
SAX方式可以一边扫描一边解析
优点是占用内存少,缺点是只能读,不能修改。
常见的解析器->DOM4J、jsoup
DOM4J
使用它需要jar包。
基本使用
public class TestDOM4J { @Test public void test1() throws DocumentException { SAXReader saxReader = new SAXReader(); Document document = saxReader.read("E:\\java-projects\\phase-2-module-2\\src\\com\\xml\\user.xml"); Element rootElement = document.getRootElement(); List<Element> elements = rootElement.elements(); for (Element e : elements) { System.out.println(e.getName()); List<Element> properties = e.elements(); for (Element ele : properties) { System.out.println(ele.getName()); } } } @Test public void test2() throws DocumentException { SAXReader saxReader = new SAXReader(); Document document = saxReader.read("E:\\java-projects\\phase-2-module-2\\src\\com\\xml\\user.xml"); Element rootElement = document.getRootElement(); List<Element> elements = rootElement.elements(); Element element = elements.get(0); String id = element.attributeValue("id"); String name = element.elementText("name"); String age = element.elementText("age"); String hobby = element.element("hobby").getText(); System.out.println(id + "\t" + name + "\t" + age + "\t" + hobby); } }
XPath
在XML中查找内容的语言。
由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便,结合XPATH就可以直接获取到某个元素
需要再导入 jaxen-1.1-beta-6.jar
例子
<?xml version="1.0" encoding="UTF-8" ?> <bookstore> <book id="book1"> <name>金瓶梅</name> <author>金圣叹</author> <price>99</price> </book> <book id="book2"> <name>红楼梦</name> <author>曹雪芹</author> <price>69</price> </book> <book id="book3"> <name>Java编程思想</name> <author>埃克尔</author> <price>59</price> </book> </bookstore>
public class TestXPath { @Test public void test1() throws DocumentException { SAXReader saxReader = new SAXReader(); Document doc = saxReader.read("E:\\java-projects\\phase-2-module-2\\src\\com\\xml\\book.xml"); Node node1 = doc.selectSingleNode("/bookstore/book/name"); System.out.println(node1.getName()); System.out.println(node1.getText()); Node node2 = doc.selectSingleNode("bookstore/book[2]/name"); System.out.println(node2.getName()); System.out.println(node2.getText()); } @Test public void test2() throws DocumentException{ SAXReader saxReader = new SAXReader(); Document doc = saxReader.read("E:\\java-projects\\phase-2-module-2\\src\\com\\xml\\book.xml"); //此时node是属性 Node node = doc.selectSingleNode("/bookstore/book/attribute::id"); System.out.println(node.getText()); Node node1 = doc.selectSingleNode("/bookstore/book[last()]/attribute::id"); System.out.println(node1.getText()); Node node2 = doc.selectSingleNode("/bookstore/book[@id='book2']"); String name = node2.selectSingleNode("name").getText(); System.out.println(name); } @Test public void test3() throws DocumentException { SAXReader saxReader = new SAXReader(); Document doc = saxReader.read("E:\\java-projects\\phase-2-module-2\\src\\com\\xml\\book.xml"); // List<Node> list = doc.selectNodes("//*"); // for (Node n :list) // System.out.println(n.getName()); // List<Node> list1 = doc.selectNodes("//name"); // for (Node n :list1) // System.out.println(n.getText()); //查找id为book1的节点下的所有的节点 List<Node> list = doc.selectNodes("/bookstore/book[@id='book1']//*"); for (Node n : list) { System.out.println(n.getName() + "\t" + n.getText()); } } }
JDBC自定义XML
因为已经使用过连接池了,可以发现,连接池通常会要求我们写配置文件。这样可以解耦,不用把一些关键信息写到代码中。
例子
<?xml version="1.0" encoding="UTF-8" ?> <jdbc> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db5?characterEncoding=UTF-8</property> <property name="user">root</property> <property name="password">980909</property> </jdbc>
public class JDBCUtilsPlus { public static String driverName; public static String url; public static String user; public static String password; static { try { SAXReader saxReader = new SAXReader(); Document document = saxReader.read("E:\\java-projects\\phase-2-module-2\\src\\com\\xml\\user.xml"); Node driver = document.selectSingleNode("/jdbc/property[@name='driverClass']"); driverName = driver.getText(); Node urlNode = document.selectSingleNode("/jdbc/property[@name='jdbcUrl']"); url = urlNode.getText(); Node userNode = document.selectSingleNode("/jdbc/property[@name='user']"); user = userNode.getText(); Node passwordNode = document.selectSingleNode("/jdbc/property[@name='password']"); password = passwordNode.getText(); Class.forName(driverName); } catch (DocumentException | ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() { try { return DriverManager.getConnection(url, user, password); } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } }