XML
1.简介
1.1 概述
XML(Extensible Markup Language):可扩展标记语言
可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。
可扩展:标签都是自定义的。例如:<user> <student>
1.2 功能
存储数据
- 配置文件
- 在网络中传输
1.3 xml与html区别
- xml标签都是自定义的,html标签是预定义的。
- xml语法严格,html语法松散
- xml是存储数据的,html是展示数据的
XML 是对 HTML 的补充。
XML 不会替代 HTML,理解这一点很重要。在大多数 web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据。
对 XML 最好的描述是:
XML 是独立于软件和硬件的信息传输工具
1.4 W3C
W3C(World Wide Web Consortium,万维网联盟)
1998年2月10日,W3C公布XML 1.0标准,XML诞生了
2. 语法
2.1 基本语法
xml文档的后缀名xml
xml第一行必须是定义文档声明<?xml version=‘1.0’ ?>
xml中有且仅有一个根标签
属性值必须使用引号(单引号、双引号)引起来
标签必须正确关闭
xml标签名区分大小写
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>20</age>
<gender>man</gender>
</user>
<user id='2'>
<name>lisi</name>
<age>23</age>
<gender>man</gender>
</user>
</users>
2.2 组成部分
文档声明
- 格式:<?xml 属性列表 ?>
- 属性列表:
- version:版本号,必须的属性
- encoding:编码方式,告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
- standalone:是否独立,取值:yes,不依赖其他文件;no,依赖其他文件
指令(了解):结合CSS
- <?xml-stylesheet type=“text/css” href=“s.css” ?>
标签:标签名称自定义的
- 命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
属性:
- id属性值唯一
文本:
- CDATA区:在该区域中的数据会被原样展示
- 格式:<![CDATA[ 数据 ]]>
<?xml version="1.0" encoding="utf-8"?>
<!--<?xml-stylesheet type="text/css" href="s.css" ?>-->
<users>
<user id='1'>
<name>zhangsan</name>
<age>20</age>
<gender>man</gender>
</user>
<user id='2'>
<name>lisi</name>
<age>23</age>
<gender>man</gender>
</user>
<code>
<!-- xml中 < > & 等有特殊含义的需要转义
< - <
> - >
& - &
-->
<!--if(a < b && a > c){}-->
<!--使用转义之后阅读不方便,可以使用CDATA区-->
<![CDATA[if(a < b && a > c){}]]>
</code>
</users>
约束:规定xml文档的书写规则
- 作为框架的使用者:
- 能够在xml中引入约束文档
- 能够简单的读懂约束文档
-
分类:
- DTD:一种简单的约束技术
- Schema:一种复杂的约束技术
-
DTD:
- 引入dtd文档到xml文档中
- 内部dtd:将约束规则定义在xml文档中
- 外部dtd:将约束规则定义在外部的dtd文档中
- 本地:<!DOCTYPE 根标签名 SYSTEM “dtd文件路径”>
- 网络:<!DOCTYPE 根标签名 PUBLIC “dtd文件名” “dtd文件路径URL”>
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE students SYSTEM "student.dtd"> <!--<!DOCTYPE students [ <!ELEMENT students (student+) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED> ]>--> <students> <student number="s001"> <name>zhangsan</name> <age>20</age> <sex>man</sex> </student> <student number="s002"> <name>lisi</name> <age>23</age> <sex>woman</sex> </student> </students>
- 引入dtd文档到xml文档中
-
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 version="1.0" encoding="utf-8" ?> <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" > <student number="itcast_0001"> <name>zhangsna</name> <age>20</age> <sex>female</sex> </student> </students>
-
2.3 解析
解析:操作xml文档,将文档中的数据读取到内存中
操作xml文档:
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到文档中。持久化的存储
解析xml的方式:
- DOM:将标记语言一次性加载到内存,在内存中形成一棵DOM树
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:占内存
- SAX:逐行读取,基于事件驱动的
- 优点:不占内存
- 缺点:只能读取,不能增删改
xml常见的解析器:
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据
- PULL:Android操作系统内置的解析器,sax方式的
学习Jsoup解析器:
-
快速入门:
-
步骤:
- 导入jar包(官网下载)
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
-
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; /** * Jsoup快速入门 */s public class JsoupDemo01 { public static void main(String[] args) throws IOException { //2.获取Document对象,根据xml获取 //2.1获取student.xsml的path String path = JsoupDemo01.class.getClassLoader().getResource("a.xml").getPath(); //2.2解析xml文档,加载文档进内存,获取dom树 ---- Document Document document = Jsoup.parse(new File(path),"utf-8"); System.out.println(document); //3.获取元素对象 Element Elements elements = document.getElementsByTag("name"); //3.1获取第一个name的Element元素对象 Element element = elements.get(0); //3.2获取数据 String name = element.text(); System.out.println(name); } }
-
-
对象的使用
-
Jsoup:工具类,可以解析html或xml文档,返回Document
- parse:解析html或xml文档,返回Document
- parse(File path,String charsetName):解析xml或html文件的
- parse(String html):解析xml或html字符串
- parse(URL url,int timeoutMillis):通过网络路径获取html或xml的文档对象
package jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; public class JsoupDemo02 { public static void main(String[] args) throws Exception { String xml= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<users>\n" + " <user id='1'>\n" + " <name>zhangsan</name>\n" + " <age>20</age>\n" + " <gender>man</gender>\n" + " </user>\n" + " <user id='2'>\n" + " <name>lisi</name>\n" + " <age>23</age>\n" + " <gender>man</gender>\n" + " </user>\n" + "</users>"; //parse(String html):解析xml或html字符串 // Document document = Jsoup.parse(xml); // System.out.println(document); //parse(URL url,int timeoutMillis):通过网络路径获取html或xml的文档对象 URL url = new URL("https://mp.csdn.net/console/article"); Document document2 = Jsoup.parse(url, 10000); System.out.println(document2); } }
- parse:解析html或xml文档,返回Document
-
Document:文档对象,代表内存中的dom树
- 获取Element对象
- getElementById(String id):根据id属性值来获取唯一的element对象
- getElementsByTag(String tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key,String value):根据对应的属性名称和属性值获取元素对象集合
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; import java.net.URISyntaxException; /** * Document/Element对象 */ public class JsoupDemo03 { public static void main(String[] args) throws IOException, URISyntaxException { //1.获取student.xml的path String path = JsoupDemo03.class.getClassLoader().getResource("student.xml").toURI().getPath(); //2.获取Document对象 Document document = Jsoup.parse(new File(path),"utf-8"); //3.获取元素对象 //3.1获取所有student对象 Elements elements = document.getElementsByTag("student"); System.out.println(elements); System.out.println("-------------------"); //3.2获取元素属性名称为id的对象集合 Elements elements1 = document.getElementsByAttribute("id"); System.out.println(elements1); System.out.println("-------------------"); //3.3获取number属性值为itcast_0001的元素对象 Elements elements2 = document.getElementsByAttributeValue("number", "itcast_0001"); System.out.println(elements2); System.out.println("-------------------"); //3.4获取属性id值为1的元素对象 Element element = document.getElementById("1"); System.out.println(element); } }
- 获取Element对象
-
Elements:元素Element对象的集合,可以当作ArrayList<Element>来使用
-
Element:元素对象
- 获取子类元素对象:
- getElementById(String id):根据id属性值来获取唯一的element对象
- getElementsByTag(String tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key,String value):根据对应的属性名称和属性值获取元素对象集合
- 获取属性值:
- String attr(String key):根据属性名称获取属性值
- 获取文本内容:
- String text():获取所有子标签的纯文本内容
- String html():获取标签体的所有内容(包括子标签的字符串内容)
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; import java.net.URISyntaxException; /** * Document/Element对象 */ public class JsoupDemo04 { public static void main(String[] args) throws IOException, URISyntaxException { //1.获取student.xml的path String path = JsoupDemo04.class.getClassLoader().getResource("student.xml").toURI().getPath(); //2.获取Document对象 Document document = Jsoup.parse(new File(path),"utf-8"); //3.获取元素对象 //3.1获取所有name对象 Elements elements = document.getElementsByTag("name"); System.out.println(elements.size()); System.out.println("-------------------"); //通过student对象获取子标签name对象 Element element = document.getElementById("1"); Elements ele_name = element.getElementsByTag("name"); System.out.println(ele_name.size()); System.out.println("-------------------"); //根据属性名称获取属性值 String id = element.attr("id"); System.out.println(id); System.out.println("-------------------"); //获取所有子标签的纯文本内容 String text = element.text(); System.out.println(text); System.out.println("-------------------"); //获取标签体的所有内容(包括子标签的字符串内容) String html = element.html(); System.out.println(html); } }
- 获取子类元素对象:
-
Node:节点对象
- 是Document和Element的父类
-
2.4 快捷查询方式
selector选择器
使用的方法:Elements select(String cssQuery)
-
语法:参考Selector类中定义的方法(Jsoup官网下载API文档)
-
package jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; /** * 选择器查询 */ public class JsoupDemo05 { public static void main(String[] args) throws IOException, URISyntaxException { //1.获取student.xml的path String path = JsoupDemo05.class.getClassLoader().getResource("student.xml").toURI().getPath(); //2.获取Document对象 Document document = Jsoup.parse(new File(path),"utf-8"); //3.查询name标签 Elements elements = document.select("name"); System.out.println(elements); System.out.println("============================"); //4.查询id值为1的元素对象 Elements elements1 = document.select("#1"); System.out.println(elements1); System.out.println("============================"); //5.获取student标签id属性值为1的子标签age对象 Elements elements2 = document.select("student[id='1'] > age"); System.out.println(elements2); } }
Xpath:Xpath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言
- 使用Jsoup的Xpath需要额外导入jar包
- 查询w3cschool参考手册,使用Xpath的语法完成查询
package 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 java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.List;
/**
* Xpath查询
*/
public class JsoupDemo06 {
public static void main(String[] args) throws IOException, URISyntaxException, XpathSyntaxErrorException {
//1.获取student.xml的path
String path = JsoupDemo06.class.getClassLoader().getResource("student.xml").toURI().getPath();
//2.获取Document对象
Document document = Jsoup.parse(new File(path),"utf-8");
//3.根据doucument对象,创建JXDocument
JXDocument jxDocument = new JXDocument(document);
//4.结合Xpath语法查询
//4.1查询所有student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
System.out.println(jxNodes);
System.out.println("======================");
//4.2查询所有student标签下的name标签
List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes1) {
System.out.println(jxNode);
}
System.out.println("======================");
//4.3查询student标签下带有number属性的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@number]");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("======================");
//4.4查询student标签下带有number=itcast_0001属性的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@number='itcast_0001']");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
}
}