概念
Extensible Markup Language:可扩展标记语言
可扩展:标签不是定义好的,而是自定义的。功能:存储数据,用于作配置文件或在网络中传输
XML与HTML的区别:
(1)xml标签都是自定义的,html标签是预定义的
(2)xml的语法严格,html的语法松散
(3)xml是存储数据的,html是展示数据的
语法:
(1)基本语法:
- xml文档后缀名为.xml
- xml文档第一行必须定义文档声明(必须在第一行,前面有一个空格都不行)
- xml文档中有且仅有一个根标签
- 属性值必须使用引号括起来(单双都可以)
- 标签必须有关闭,要么是有一个闭合标签,要么是自闭标签
- 标签名称区分大小写
(2)快速入门:
(3)组成部分:
- 文档声明
(1)格式:<?xml 属性列表 ?>
(2)属性列表:
【1】version:版本号,必须的属性,一般写1.0即可
【2】encoding:编码方式,告知解析引擎当前文档使用的字符集,默认iso-8859-1
【3】standalone(了解以下即可,不重要):是否独立,yes或者no - 指令(了解即可,不重要):可用来导入css文件
- 标签:标签名称定义有一些规则,可在官网查看
- 属性:id属性值唯一
- 文本内容:CDATA区,在该区域中的数据会被原样展示,不需要写转义字符,格式为:
<![CDATA[
if(a < b && a > c){}
]]>
(4)约束:规定xml文档的书写规则
对于约束的掌握要求是(重点,其他都不用管,会这两点就够了):
【1】能够在xml中引入约束文档
【2】能够简单地读懂约束文档约束分类:
(1)DTD:一种简单的约束技术
(2)Schema:一种复杂的约束技术DTD:
(1)引入dtd文档(内部dtd):将约束规则定义在xml文档中,内部dtd不必引入
(2)引入dtd文档(外部dtd):将约束规则定义在外部dtd文件中 ,引入分为两种
【1】本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的路径">
【2】网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的URL">SCHEMA:
(1)填写xml的根标签
(2)引入xsi前缀,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
(3)引入xsd文件命名空间,xsi:schemaLocation="http://xxx/xxx/xx a.xsd"
(4)为每一个xsd约束声明一个前缀,作为标识:xmlns:标识符="http://xxx/xxx/xx"(值和命名空间一样)
引入命名空间后,所有标签前面都要加入命名空间,否则报错。但是这样写太麻烦,所以给命名空间起前缀标识符,在标签前面加入标识符即可,如:
xmlns:a = "http://xxx/xxx/xx"
<a:users>
</a:users>
如果xmlns后面什么都不写,默认就是空前缀
小例子:
<?xml version='1.0'?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.itcast.cn/xml student.xsd
http://www.baidu.com/xml user.xsd
"
xmlns:a="http://www.itcast.cn/xml"
xmlns:b="http://www.baidu.com/xml"
>
<user>
<a:name>张三</a:name>
<a:age>21</a:age>
<b:gender>男</b:gender>
</user>
</users>
解析
操作XML文档:
- 1.解析(读取)
- 2.写入(保存)
解析XML文档的方式:
1.DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树
优点:操作方便,可以对文档进行CRUD操作
缺点:占内存2.SAX:逐行读取,基于事件驱动
优点:不占内存
缺点:只能读取,不能增删改
XML常见的解析器:
- 1.JAXP:sun公司提供的解析器,支持DOM和SAX (这种写起来比较麻烦,了解即可)
- 2.DOM4J:一款非常优秀的解析器,支持DOM
- 3.Jsoup:一款好用的HTML解析器,也可以用来解析XML,支持DOM
- 4.PULL:安卓系统内置解析器,支持SAX
Jsoup解析器:
- 快速入门
1.导入jar包
2.获取Document对象
3.获取对应的标签Element对象
4.获取对象的数据
小例子:
public class JsoupDemo1 {
//Jsoup快速入门
public static void main(String[] args) throws IOException {
//1.获取Document对象
//根据xml文档获取document对象
File file = new File(JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath());
Document document = Jsoup.parse(file, "utf-8");
//2.获取元素对象
Elements elements = document.getElementsByTag("name");
System.out.println(elements.get(0));
}
}
涉及到的类和方法:
- 1.Jsoup.parse(File file,String charsetName):解析Html或Xml文档,返回Document对象
- 1.1 Jsoup.parse(String html):解析html或xml字符串
- 1.2 Jsoup.parse(String url,Long timeoutMillis):在超时时间内解析URL
- 2.Document:文档对象,代表内存中的Document树
主要用于获取Element对象,方法为继承自Element的getElementBy系列方法 - 3.Elements:元素Element对象的集合,可以当作ArrayList<Element>
- 4.Element:元素对象
- 5.Node:节点对象
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;
import java.io.IOException;
public class JsoupDemo2 {
public static void main(String[] args)throws IOException {
Document document = Jsoup.parse(new File(JsoupDemo2.class.getClassLoader().getResource("student.xml").getPath()), "utf-8");
//1.获取所有student对象
Elements elements = document.getElementsByTag("student");
System.out.println(elements);
System.out.println("============");
//2.获取所有设置了id属性的元素
Elements elements1 = document.getElementsByAttribute("id");
System.out.println(elements1);
System.out.println("============");
//3.获取number属性为002的元素
Elements elements2 = document.getElementsByAttributeValue("number", "002");
System.out.println(elements2);
System.out.println("============");
//4.获取id值为1的元素
Element element = document.getElementById("1");
System.out.println(element);
}
}
Element对象:
1.对于Document的一系列getElementBy方法,Element对象都能使用,但是其效果不是获取所有元素,而是获取其子元素
2.获取属性值:String attr(String key):根据属性名称获取属性值
3.获取文本:
String text():获取文本
String html():获取Html
根据选择器查询
我们可以看出,Jsoup通过Node对象提供的方法去获取DOM元素的话,其实和JS中的DOM操作是一样的,这样在精确获取某些元素时,会显得不太方便。
因此,需要使用其他更为灵活的方式来获取元素。
(1)selector:选择器
使用的方法:Element类中的Elements select(String cssQuery):选择器和JQ的基本一样
选择器参考Selector类。
小例子:
public class JsoupDemo4 {
public static void main(String[] args)throws IOException {
Document document = Jsoup.parse(new File(JsoupDemo4.class.getClassLoader().getResource("student.xml").getPath()), "utf-8");
Elements elements = document.select("name");
System.out.println(elements);
System.out.println("=============================");
Elements elements1 = document.select("#1");
System.out.println(elements1);
System.out.println("=============================");
//获取number属性值为001的student标签下的age标签
Elements elements2 = document.select("student[number='001'] > age");
System.out.println(elements2);
}
}
(2)XPath
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
Xpath其实和Jsoup的关系不是特别大,只要有DOM树,都可以使用Xpath来进行获取元素,比如DOM4J、JAXP等。
使用步骤:
1、导入xpath的jar包
xpath有专门结合jsoup来生成DOM树的jar包,即JsoupXpath.jar
2、根据Jsoup的Document对象,来创建支持Xpath语法的JXDocument对象
3、结合Xpath语法进行查询
小例子:
public class XpathDemo1 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
Document document = Jsoup.parse(new File(XpathDemo1.class.getClassLoader().getResource("student.xml").getPath()), "utf-8");
//参加Xpath DOM树
JXDocument jxDocument = new JXDocument(document);
//根据语法查询元素
//1.查询所有student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
System.out.println(jxNodes);
//2.查询所有student标签下的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
System.out.println(jxNodes2);
//3.选取所有student标签虚啊带有id属性的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
System.out.println(jxNodes3);
//4.选取所有student标签虚啊带有id属性,并且id属性为1的name标签
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='1']");
System.out.println(jxNodes4);
}
}