JavaWeb - XML
1.XML介绍
1.概念:Extensible Markup Language 可扩展标记语言
*可扩展:标签都是自定义的。<user> <student>
2.功能:
*存储数据
1.配置文件
2.在网络中传输
3.与html的区别
1.xml标签都是自定义的,html标签时预定义的
2.xml的语法严格
3.xml是存储数据的,html是展示数据的
*W3C:万维网联盟
2.语法快速入门
*基本语法:
1. xml文档的后缀名 .xml
2. xml第一行必须定义为文档声明!!
3. xml文档中有且仅有一个根标签
4. 属性值必须使用引号 单双引号都行
5. 标签必须正确关闭
6. xml标签名称区分大小写
*组成部分:
1.文档声明
1.格式 <?xml 属性列表 ?>
2.属性列表:
*version:版本号,必须的属性
*encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
*standalong:是否独立 取值:yes或者no 是否依赖其他文件
2.指令(了解):结合css的
*<?xml-stylesheet type="text/css" href="a.css" ?>
3.标签:标签名称自定义
规则:
1.数字、标点符号不能开头
2.名称不能以xml开头
3.名称不能包含空格
4.属性:id属性值唯一
5.文本:
* CDATA区:在该区域中的数据会被原样展示
* 格式:<!【CDATA】【数据】>
3.约束:规定xml文档的书写规则
* 作为框架的使用者(程序员):
1.能够在xml中引入约束文档
2.能够简单的读懂约束文档
*分类:
1.DTD:一种简单的约束技术
2.Schema:一种复杂的约束技术 后缀名xsd
*DTD:
* 引入DTD文档到xml文档中
*内部dtd:将约束规则定义在xml文档中
*外部dtd:将约束的规则定义在外部的dtd文件中
*本地的:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
*网络的:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
*Schema:
<!--
1.填写xml文档的根元素
2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml" 此为默认情况
xmlns:a="http://www.itcast.cn/xml" 这样表示a为其缩略名
-->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
>
3.解析XML文档
1.操作xml文档,将文档中的数据读取到内存中
1.解析(读取):将文档中的数据读取到内存中
2.写入:将内存中的数据保存到xml文档中。持久化存储
2.解析xml的方式:
1.DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树
*优点:操作方便,可以对文档进行CRUD的所有操作
*缺点:占内存
2.SAX:逐行读取,基于事件驱动的。
*优点:不占内存
*缺点:只能读取,不能增删改
3.XML常见的解析器
1.JAXP :sun公司提供的解析器,支持dom和sax两种思想
2.DOM4J :一款非常优秀的解析器
3.Jsoup :java的html解析器
4.PULL :Android操作系统内置的解析器,sax方式
4.Jsoup
*快速入门:
*步骤:
1.导入jar包
2.获取Document对象
3.获取对应的标签Element对象
4.获取数据
package XML_Document.Jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; public class Jsoup_Demo01 { public static void main(String[] args) throws IOException { //获取document对象,根据xml获得 //2.1通过类加载器获取myxml的path String path = Jsoup_Demo01.class.getClassLoader().getResource("XML_Document/myxml.xml").getPath(); //2.2 解析xml文档 加载文档进内存,获取dom数 - - > Document Document document = Jsoup.parse(new File(path), "utf-8"); //3.获取元素对象 Elements elements = document.getElementsByTag("name"); //4.获取第一个name的element对象 Element element = elements.get(0); //获取数据 System.out.println(element.text()); } }
5.对象的使用
1. Jsoup :工具类,可以去解析html或xml文档,返回document对象
* parse :解析html和xml文档,返回Document
* parse(File in , String CharsetName): 解析html和xml文件的
* parse(String html):解析字符串
* parse(URL url , int TimeoutMillis):通过网络路径获取指定的html或xml的文档对象 以后可以用于爬虫爬取html
2. Document :文档对象,代表内存中的dom树
*获取Element对象
*getElementById(String id):根据id属性值获取唯一的Element对象
*getElementsByTag(String tagName):根据标签名称获取元素对象集合
*getElementsByAttribute(String key):根据属性名称获取元素对象集合
*getElementsByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合
3. Elements :元素Element对象的集合。可以把它当做一个Arraylist<Element>来使用
4. Element :元素对象
1.获取子元素对象
2.获取属性值
* String attr(String key):根据属性名称获取属性值
3.获取文本内容
* String text():获取所有子标签的纯文本内容
*String html():获取标签体的所有内容(包括子标签的标签和文本字符串内容)
5. Node : 节点对象
*是Document和Element的父类
package XML_Document.Jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; public class Jsoup_Demo02 { public static void main(String[] args) throws IOException { String path = Jsoup_Demo01.class.getClassLoader().getResource("XML_Document/myxml.xml").getPath(); Document document = Jsoup.parse(new File(path), "utf-8"); //这是通过document来获取name标签,可以获取到两个 Elements elements = document.getElementsByTag("name"); System.out.println(elements); //先获取第一个student元素,然后通过element对象获取其子标签name,此时获取到1个 Element element_student01 = document.getElementsByTag("student").get(0); Elements name = element_student01.getElementsByTag("name"); System.out.println(name); System.out.println(name.text()); //获取student对象的属性值 String number = element_student01.attr("number"); System.out.println(number); } }
4.快捷查询方式
1.selector:选择器
*使用的方法:Elements select(String cssQuery)
语法:参考Selector类中定义的语法
package XML_Document.Jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; public class Jsoup_Demo03 { public static void main(String[] args) throws IOException { String path = Jsoup_Demo01.class.getClassLoader().getResource("XML_Document/myxml.xml").getPath(); Document document = Jsoup.parse(new File(path), "utf-8"); //根据选择器来查找 //1.查找所有name标签 Elements name = document.select("name"); //2.查找id值为3 Elements tag = document.select("#s002"); // System.out.println(tag); //获取student标签里number为s002的age子标签 Elements elements_student = document.select("student[number=\"s002\"]"); System.out.println(elements_student); Elements elements_student_age = document.select("student[number=\"s002\"] > age"); System.out.println("=============="); System.out.println(elements_student_age); } }
2.XPath:XPath既为XML路径语言
* 使用Jsoup的XPath需要额外导入jar包,且要查询W3Cschool参考手册,来完成查询
package XML_Document.Jsoup; import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException; import cn.wanghaomiao.xpath.model.JXDocument; import cn.wanghaomiao.xpath.model.JXNode; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; import java.util.List; public class Jsoup_Demo04 { public static void main(String[] args) throws IOException, XpathSyntaxErrorException { String path = Jsoup_Demo01.class.getClassLoader().getResource("XML_Document/myxml.xml").getPath(); Document document = Jsoup.parse(new File(path), "utf-8"); //根据document对象,创建JXDocument对象(因为他支持java语法) JXDocument jxDocument = new JXDocument(document); //4.结合XPath语法查询 //查询所有的student标签 List<JXNode> jxNodes = jxDocument.selN("//student"); for (JXNode jxNode : jxNodes) { System.out.println(jxNode); } System.out.println("=========="); //查询所有student标签下的name标签 List<JXNode> jxNodes1 = jxDocument.selN("//student/name"); for (JXNode jxNode : jxNodes1) { System.out.println(jxNode); } //查询student标签下带有id属性的name标签 List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]"); for (JXNode jxNode : jxNodes2) { System.out.println(jxNode); } //查询student标签下带有id属性的name标签 并且id属性值为itcast List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='001']"); for (JXNode jxNode : jxNodes3) { System.out.println(jxNode); } } }