(一)、XML入门(可扩展标记语言)
一种数据表示格式,可以用于自定义数据格式。
作用:用于进行存储数据和传输数据或作为软件的配置文件
1.XML语法与标签(元素)规则
//语法
<?xml version="1.0" encoding="UTF-8" ?>
version:XML默认的版本号码、该属性是必须存在的
encoding:本XML文件的编码
2.XML标签(元素)规则
- 标签由一对尖括号和合法标识符组成<name></name>必须存在一个根标签有且只能有一个。 标签必须成对出现,有开始,有结束: <name></name>
- 特殊的标签可以不成对,但是必须有结束标记,如:<br/>
- 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来<student id = “1”></name>
3.存在的特殊字符(正常使用会与标签信息有冲突)
- < < 小于
- > > 大于
- & & 和号
- ' ' 单引号
- " " 引号
也可以用CDATA区: <![CDATA[ …内容… ]]>//不会有冲突
<?xml version="1.0" encoding="UTF-8" ?> <!--根标签有且只能有一个--> <student> <name>美波</name> <sex>女</sex> <hobby>内脏</hobby> <info> <age>22</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>
4.文档约束
用来限定xml文件中的标签以及属性应该怎么写,以此强制约束程序员必须按照文档约束的规定来编写xml文件。
XML文档约束-DTD的使用(了解)
- 编写DTD约束文档,后缀必须是.dtd
- 在需要编写的XML文件中导入该DTD约束文档
- 按照约束的规定编写XML文件的内容
//data1.dtd 文件
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
//xml文件实现
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data1.dtd">//申明
<书架>//写入此字段后面就直接生成
<书>
<书名>dadad</书名>
<作者>dada</作者>
<售价>add</售价><!--不能指定数据类型-->
</书>
</书架>
XML文档约束方式二-schema约束(了解)//能约束数据类型
(二)、XML的解析
使用程序读取XML中的数据
两种解析方法
- SAX解析(一段一段的解析)
- DOM解析(全部一次性解析,大文件也好解析)//首选解析工具:dom4j
Document对象:整个xml文档
{Element对象:标签;Attribute对象:属性;Text对象:文本内容} ==> Node对象
1.使用Dom4J解析出XML文件
import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; import java.io.InputStream; //使用dom4j解析XML文件 public class Dom4jHelloWorldDemo1 { @Test public void parseXMLData() throws Exception{ //创建Dom4j的解析器,代表整个dom4j框架 SAXReader saxReader = new SAXReader(); //把XML文件加载到内存成为一个Document文档对象 //Document document = (Document) saxReader.read(new File("xml-app\\src\\Contacts.xml"));//需要通过模块名定位 InputStream is = Dom4jHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml"); Document document = saxReader.read(is);//直接去src下寻找文件 //获取根元素对象 Element root = document.getRootElement(); System.out.println(root.getName()); } }
2.Dom4J解析XML文件中的各种节点
//xml文件 <?xml version="1.0" encoding="UTF-8" ?> <contactList> <contact id = "1" vip = "true"> <name> 美波 </name> <gander>女</gander> <email>bobo@itcast.cn</email> </contact> <contact id = "2" vip = "false"> <name> 小栗旬 </name> <gander>男</gander> <email>xunxun@itcast.cn</email> </contact> <contact id = "1" vip = "false"> <name> 胰脏 </name> <gander>女</gander> <email>yiyi@itcast.cn</email> </contact> <user> </user> </contactList> //Dom4j解析元素、属性、文本 import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; import java.io.InputStream; import java.util.List; //使用dom4j解析XML文件 public class Dom4jHelloWorldDemo1 { @Test public void parseXMLData() throws Exception{ //创建Dom4j的解析器,代表整个dom4j框架 SAXReader saxReader = new SAXReader(); //把XML文件加载到内存成为一个Document文档对象 //Document document = (Document) saxReader.read(new File("xml-app\\src\\Contacts.xml"));//需要通过模块名定位 InputStream is = Dom4jHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml"); Document document = saxReader.read(is);//直接去src下寻找文件 //获取根元素对象 Element root = document.getRootElement(); System.out.println(root.getName()); //拿根元素下的全部子元素对象 //List<Element> sonEles = root.elements();//根拿子 List<Element> sonEles = root.elements("contact");//拿某个子元素 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()); } }
3.Dom4j解析案例
//已创建Contect对象,之后解析 import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; import java.util.ArrayList; import java.util.List; public class Dom4JTest2 { //解析XML中的数据成为一个List集合对象 @Test public void parseToList() throws Exception{ //导入框架 //创建SaxReader对象 SAXReader saxReader = new SAXReader(); //加载XML文件成为文档Document对象 Document document = saxReader.read(Dom4JTest2.class.getResourceAsStream("/Contacts.xml")); //先拿根元素 Element root = document.getRootElement(); //提取contact子元素 List<Element> contactEles = root.elements("contact"); //准备一个ArrayList集合封装联系人信息 List<Contact> contacts = new ArrayList<>(); //遍历Contact子元素 for (Element contactEle : contactEles) { //每个子元素都是一个联系人对象 Contact contact = new Contact(); contact.setId(Integer.valueOf(contactEle.attributeValue("id"))); contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip"))); contact.setName(contactEle.elementTextTrim("name")); contact.setGendar(contactEle.elementTextTrim("gender").charAt(0)); contact.setEmail(contactEle.elementText("email")); contacts.add(contact); } //遍历List集合 for (Contact contact : contacts) { System.out.println(contact); } } } //运行结果 Contact{name='美波', id=1, vip=true, gendar=女, email='bobo@itcast.cn'} Contact{name='小栗旬', id=2, vip=false, gendar=男, email='xunxun@itcast.cn'} Contact{name='胰脏', id=1, vip=false, gendar=女, email='yiyi@itcast.cn'}
4.使用Xpath检索出XML文件
public class XPathDemo { //绝对路径:/根元素/子元素/孙元素;//相对路径:./子元素/孙元素(不能跨级) @Test public void parse02() throws Exception{ SAXReader saxReader = new SAXReader(); //把XML加载成Document文档对象 Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contact2.xml")); //检索全部名称 List<Node> nameNode = document.selectNodes("/contactList/contact/name"); for (Node node : nameNode) { Element nameEle = (Element) nameNode; System.out.println(nameEle.getTextTrim()); } } //元素 再全文找这个元素 //元素1/元素2 在全文找元素1下面的一级元素2 //元素1//元素2 在全文找元素1下面的全部元素2 public void parse03() throws Exception{ SAXReader saxReader = new SAXReader(); //把XML加载成Document文档对象 Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contact2.xml")); //检查数据 //List<Node> nameNodes = document.selectNodes("//name"); List<Node> nameNodes = document.selectNodes("//contact/name"); for (Node nameNode : nameNodes) { Element nameEle = (Element) nameNode; System.out.println(nameEle.getTextTrim()); } } //@属性名称 在全文检索属性对象 //元素【@属性名称】 在全文检索包含该属性的元素对象 //元素【@属性名称=值】 在全文检索包含该属性的元素且属性值为该值的元素对象 public void parse04() throws Exception{ SAXReader saxReader = new SAXReader(); //把XML加载成Document文档对象 Document document = saxReader.read(XPathDemo.class.getResourceAsStream("/Contact2.xml")); //检索全部名称 List<Node> nides = document.selectNodes("//@id"); for (Node node1 : nides) { Attribute attr = (Attribute) node1; System.out.println(attr.getName() + "==>" + attr.getValue()); } //查询name元素(包含id属性的) //Node node = document.selectSingleNode("//name[@id]"); Node node = document.selectSingleNode("//name[@id=1]"); Element ele = (Element) node; System.out.println(ele.getTextTrim()); } }