XML
1.概念:可扩展标记语言
*可扩展:标签都是自定义的。
2.功能:存储数据:1.配置文件,2.在网络中传输
3.xml和html的区别:
- xml的标签是自定义的,html标签是预定义的
- xml语法非常严格。html语法松散
- xml是存储数据的,html是展示数据的
*w3c:万维网联盟
4.语法:
*基础语法:
- xml文档的后缀名是.xml
- 第一行必须定义为文档声明
- xml文档中有且仅有一个根标签
- 属性值必须使用引号引起来(单双引号都可以)
- 标签必须有结束标签(也可以定义自闭合标签)
- xml的标签名称区分大小写
如:
*组成部分:
- 文档声明:
- 格式:<?xml 属性列表>
- 属性列表:1.version-版本号,2.encoding-编码方式(默认值iso-8859-1),3.standalone-是否独立(yes:不依赖其他文件,no:依赖其他文件)
- 指令(了解即可):结合css展示数据
引入a.css使得名字变成红色
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/css" href="a.css" ?>
<users>
<user id="1">
<name>张三</name>
<age>23</age>
<gender>man</gender>
</user>
<user id="2">
<name>李四</name>
<age>24</age>
<gender>woman</gender>
</user>
</users>
- 标签:自定义的,命名方式与java类似
- 属性 :id属性值唯一
- 文本:特殊字符需要转译
*CDATA区:该区域中的数据会被原样展示
<![CDATA[需要原样展示的数据]]>
- 约束:规定xml文档的书写规则
*要求能够在xml种引用约束文档,能够简单的读懂约束文档
*分类:- DTD:一种简单的约束技术
- Schema:一种复杂的约束技术
- DTD:
- 引入dtd文档导入xml文档中
- 内部dtd:将约束规则定义在xml文档中
- 外部dtd:将约束规则定义在外部的dtd文件中
*本地:
*网络:
- Schema:
- .填写xml文档的根元素
- 引入xsi前缀. xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
- 引入xsd文件命名空间. xsi:schemaLocation=“http://www.itcast.cn/xml student.xsd”
- 为每一个xsd约束声明一个前缀,作为标识 xmlns=“http://www.itcast.cn/xml”
解析:操作xml文档,将文档中的数据读取到内存中
- 操作xml文档
- 解析(读取):讲文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中,持久化的储存
- 解析xml的方式:
- DOM:将标记语言文档一次性加载进内存,在内存中形成一棵DOM树
*优点:操作方便,可以对文档进行CRUD的所有操作
*缺点:比较的消耗内存 - SAX:逐行读取,基于事件驱动
*优点:因为逐行读取所以不占内存
*缺点:只能读取,不能增删改
- DOM:将标记语言文档一次性加载进内存,在内存中形成一棵DOM树
- 常见的xml解析器
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:一款java的html解析器
- PULL:Android系统内置的解析器,是sax方式的
- Jsoup解析器:
- 快速入门:
- 导入jar包下载地址,提取码abcd
- 获取Document对象
- 获取对应的标签
- 获取数据
- 快速入门:
模板代码
package Jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
/*
Jsoup快速入门
*/
public class JsoupDemo1 {
public static void main(String[]args)throws Exception{
//获取Document对象
//根据xml文档来获取
//获取sudent.xml的path
String path=JsoupDemo1.class.getClassLoader().getResource("dtd/student.xml").getPath() ;
//解析xml文档,加载文档进内存,获取dom树(document对象)
Document document= Jsoup.parse(new File(path),"utf-8");
//根据标签名称获取元素对象
Elements elements= document.getElementsByTag("name");
System.out.println(elements.size());
//获取第一个element对象
Element element=elements.get(0);
String name=element.text();
System.out.println(name);
}
}
- 对象的使用
- Jsoup:工具类,可以解析html或者xml文档,返回document,方法:
- parse:解析html或xml文档,返回document
*parse(获取的文件 ,“编码方式”):解析xml或html
*parse(“html字符串”):解析字符串形式的文件
*parse(URL url,int timeoutMillis):通过 网络路径获取html或者xml文档
- parse:解析html或xml文档,返回document
- Document:文档对象,内存中的dom树
获取Element对象- getElementsByTag(String tagname):根据标签名称获取Element对象集合
- getElementsByAttribute(String key):根据属性名称获取Element对象集合
- getElementsByAttributeValue(String key,String value):根据对应的属性名和属性值获取Element对象集合
- getElementById(String id):根据id获取Element
- Elements:元素Element对象的集合,可以当作ArrayLis<Element>
- Element:元素对象
- 获取子元素的element对象:方法名和document一致
- 获取属性值
*String sttr(String key):根据属性名称获取属性值 - 获取文本
*String text():获取子标签文本内容(不包含标签体)
*String html():获取子标签的所有内容(包括子标签的标签体内容)
- Node:节点对象
*是document和element的父类
- Jsoup:工具类,可以解析html或者xml文档,返回document,方法:
- 快捷的查询方式:
- selector:选择器
*使用的方法:Elements.select(String cssQuery)- 语法:selector类中定义的语法
- XPath:xml的路径语言,是一种确定xml文档中某部分位置的语言
- 使用Jsoup的Xpath需要导入jar包网盘地址,提取码abcd
- 查询w3cschool的参考手册,使用xpath语法(下接模板)
- selector:选择器
快捷语法模板
package Jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
/*
selector选择器查询
*/
public class JsoupDemo5 {
public static void main(String[]args)throws Exception{
//获取sudent.xml的path
String path= JsoupDemo5.class.getClassLoader().getResource("student.xml").getPath() ;
//解析xml文档,加载文档进内存,获取dom树(document对象)
Document document= Jsoup.parse(new File(path),"utf-8");
//查询name标签
Elements elements = document.select("name");
System.out.println(elements);
System.out.println();
//查询id值为ittast的元素
Elements elements1 = document.select("#ittast");
System.out.println(elements1);
System.out.println();
//获取studnet标签,并且number属性值为s01
Elements elements2 = document.select("student[number='s01']");
Elements age = elements2.select("age");
System.out.println(elements2);
System.out.println();
//获取studnet标签,并且number属性值为s01的age子标签
Elements elements3 = document.select("student[number='s01']>age");// >代表一级子标签 直接空格获取子孙age标签
System.out.println(elements3);
System.out.println();
}
}
package Jsoup;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
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.util.List;
/*
XPath查询
*/
public class JsoupDemo6 {
public static void main(String[]args)throws Exception{
//获取sudent.xml的path
String path= JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath() ;
//解析xml文档,加载文档进内存,获取dom树(document对象)
Document document= Jsoup.parse(new File(path),"utf-8");
//根据document对象创建JXDocument对象
JXDocument jxDocument=new JXDocument(document);
//结合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);
}
System.out.println("--------------");
//查询student标签下带有id属性的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes2){
System.out.println(jxNode);
}
System.out.println("-------------");
//查询student下带有id属性的name标签并且id属性值为ittast
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='ittast']");
for (JXNode jxNode : jxNodes3){
System.out.println(jxNode);
}
}
}