黑马全套Java教程(十)(一)+https://developer.aliyun.com/article/1556519
40 XML
40.1 XML
XML是可扩展标记语言的缩写,它是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据
- 纯文本,默认使用UTF-8编码;二是可嵌套
- 如果把XML内容存为文件,那么它就是一个XML文件
- XML的使用场景:XML内容经常被当成消息进行网络传输,或者作为配置文件用于存储系统的消息
语法规则:
hello_world.xml
<?xml version="1.0" encoding="UTF-8" ?> <!-- 我是注释: 跟标签只能有一个--> <student> <name>女儿国网</name> <sex>女</sex> <hobby>唐僧</hobby> <info> <age>30</age> <addr>女儿国</addr> </info> <sql> select * from user where age < 18; select * from user where age < 18 && age > 10; <![CDATA[ select * from user where age < 18; ]]> </sql> </student>
文档约束:是用来限定xml文件中的标签以及属性应该怎么写;以此强制约束程序员必须按照文档约束的规定来编写xml文件。
DTD约束文档
例:
DTD的问题:
- 可以约束XML文件的编写
- 不能约束具体的数据类型
schema约束
例:
40.2 XML解析技术
什么是XML解析:使用程序读取XML中的数据
两种解析方式:
- SAX解析
- DOM解析
案例:dom4j解析
package d1_dom4j; /* * 目标:学会使用dom4j解析XML文件中的数据 * 1、导入dom4j框架 * 2、准备一个XML文件 */ import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; import java.io.File; import java.io.InputStream; public class Dom4JHelloWorldDemo1 { @Test public void parseXMLData() throws DocumentException { //1、创建一个Dom4j的解析对象,代表了整个dom4j框架 SAXReader saxReader = new SAXReader(); //2、把XML文件加载到内存中成为一个Document文档对象 //Document document = saxReader.read(new File("xml-app\\src\\Contacts.xml")); //需要通过模块名定位 //直接在src下寻找文件,改了模块名没有影响 InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml"); Document document = saxReader.read(is); //3、获取根元素对象 Element root = document.getRootElement(); System.out.println(root.getName()); } }
package d1_dom4j; /* * 目标:学会使用dom4j解析XML文件中的数据 * 1、导入dom4j框架 * 2、准备一个XML文件 */ import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; import org.w3c.dom.Attr; import java.io.File; import java.io.InputStream; import java.util.List; public class Dom4JHelloWorldDemo1 { @Test public void parseXMLData() throws DocumentException { //1、创建一个Dom4j的解析对象,代表了整个dom4j框架 SAXReader saxReader = new SAXReader(); //2、把XML文件加载到内存中成为一个Document文档对象 //Document document = saxReader.read(new File("xml-app\\src\\Contacts.xml")); //需要通过模块名定位 //直接在src下寻找文件,改了模块名没有影响 InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml"); Document document = saxReader.read(is); //3、获取根元素对象 Element root = document.getRootElement(); System.out.println(root.getName()); //4、拿根元素下的全部子元素对象 List<Element> sonEles = root.elements(); for (Element sonEle : sonEles) { System.out.println(sonEle.getName()); } //拿到某个子元素 Element userEle = root.element("user"); System.out.println(userEle.getName()); //默认提取第一个子元素对象 Element contact = root.element("contact"); //获取子元素文本 System.out.println(contact.elementText("name")); //去掉前后空格 System.out.println(contact.elementTextTrim("name")); //根据元素获取属性值 Attribute idAttr = contact.attribute("id"); System.out.println(idAttr.getName() + "----->" + idAttr.getValue()); //直接提取属性值 System.out.println(contact.attributeValue("id")); System.out.println(contact.attributeValue("vip")); //获取当前元素下的子元素对象 Element email = contact.element("email"); System.out.println(email.getText()); } }
案例:
package d1_dom4j; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; import java.util.ArrayList; import java.util.List; //需求:解析XML中的数据成为一个List集合对象 public class Dom4JTest2 { @Test public void parseToList() throws DocumentException { //需求:解析XML中的数据称为一个List集合对象 //1、导入框架 //2、创建SaxReader对象 SAXReader saxReader = new SAXReader(); //3、加载XML文件成为文档对象Document对象 Document document = saxReader.read(Dom4JTest2.class.getResourceAsStream("/Contacts.xml")); //4、先拿根元素 Element root = document.getRootElement(); //5、提取contact子元素 List<Element> contactEles = root.elements("contact"); //6、准备一个ArrayList集合封装联系人信息 List<Contact> contacts = new ArrayList<>(); //7、遍历Contact子元素 for (Element contactEle : contactEles) { //8、每个子元素都是一个联系人对象 Contact contact = new Contact(); contact.setId(Integer.valueOf(contactEle.attributeValue("id"))); contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip"))); contact.setName(contactEle.attributeValue("Name")); contact.setGender(contactEle.attributeValue("gender").charAt(0)); //取一个字符 contact.setEmail(contactEle.attributeValue("email")); //9、把联系人对象数据加入到List集合 contacts.add(contact); } //10、遍历List集合 for (Contact contact : contacts) { System.out.println(contact); } } }
40.3 XPath
XPath使用路径表达式来定位XML文档中的元素节点或属性节点
总结