XML(Extensible Markup Language):可扩展标记语言
可扩展:标签都是自定义的。
HTML和XML都是W3C(万维网联盟)制定的标准,最开始HTML的语法过于松散,于是W3C制定了更严格的XML语法标准,希望能取代HTML。但是程序员和浏览器厂商并不喜欢使用XML,于是现在的XML更多的用于配置文件及传输数据等功能。
是谁造成的HTML语法松散?
浏览器厂商。最开始W3C制定HTML的时候语法还是比较严格的。但浏览器厂商为了抢占市场,语法错误也可以解析成功HTML,最后“内卷”到HTML即使语法非常混乱也是可以被浏览器解析。
1、配置文件
在今后的开发过程当中我们会频繁使用框架(框架:半成品软件),使用框架时,需要写配置文件配置相关的参数,让框架满足我们的开发需求。而我们写的配置文件中就有一种文件类型是XML。
日后编写大型项目,不可能从头到尾都是原创代码,很多功能前人已经写好,我们只需要使用前人写好的半成品软件(框架),再加入一些符合我们需求的配置即可完成开发。
比如我们组装一台电脑,不可能自己焊接电路板。而是先买入一块主板,这块主板就是半成品软件。根据自己的需求加入一些配置,比如要求流畅运行吃鸡,就需要配置i7处理器、泰坦显卡。
2、传输数据
在网络中传输数据时并不能传输java对象,所以我们需要将JAVA对象转成字符串传输,其中一种方式就是将对象转为XML类型的字符串。
文件名后缀必须是xml
第一行必须是文档声明
标签区分大小写
标签必须有回标签
属性值必须用引号引起来
文档声明
文档声明必须放在第一行,格式为:
属性列表:
标签
XML中标签名是自定义的,标签名有以下要求:
指令(了解)
指令是结合css使用的,但现在XML一般不结合CSS,语法为:
属性
属性值必须用引号(单双都可)引起来
文本
如果想原样展示文本,需要设置CDATA区,格式为:
DTD是一种较简单的约束技术,引入方式如下:
例:
第一行:定义了根标签students,允许有多个子标签student
第二行:定义student标签可以有三个子标签(name,age,sex)
三、四、五行:定义了name,age,sex是文本类型
最后一行:定义了student标签的number属性,值为id类型,且number属性必须写
Schema比DTD对XML的约束更加详细,引入方式如下:
例如:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itbaizhan.cn/xml student.xsd"
xmlns="http://www.itbaizhan.cn/xml"
>
XML解析即读写XML文档中的数据。框架的开发者通过XML解析读取框架使用者配置的参数信息,开发者也可以通过XML解析读取网络传来的数据。XML有如下解析思想:
DOM解析思想
SAX解析思想
将标记语言文档一次性加载进内存,在内存中形成一颗dom树
学过js的兄嘚应该比较了解,也就是DOM操作嘛,将xml文件转为Document对象,从而可以使用Document对象对元素进行增删改
逐行读取,基于事件驱动的。
Jsoup的作用就是将xml文件转为document对象,通过document对象对元素进行CRUD,js可以将html转为document对象,Jsoup可以将xml转为document对象
导入Jsoup的jar包
这个jar包我放在百度网盘了大家想要的通过下面这个链接直接领取吧
链接:https://pan.baidu.com/s/1CM0t-dOyPAgPQcVPjU1S0w?pwd=04h9
提取码:04h9
Jsoup:可以解析xml或html,形成dom树对象。
parse方法的重载:
Document:xml的dom树对象
常用方法:
Element: 元素对象
常用方法:
例:
我们这里借用一下知乎日报,实现Jsoup爬虫技术
因为Jsoup可以上传网络资源并转为Document对象,所以使用Jsoup完成爬虫是非常简单的,直接上代码把,我们可以根据知乎日报网站的源代码寻找作者、内容、标题、图片等等内容
- package com.baizhan.crawler;
-
- 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.MalformedURLException;
- import java.net.URL;
-
- public class CrawlerDemo {
- public static void main(String[] args) throws IOException {
- //循环爬取数据
- int min = 0;
- int max = 0;
- //通过配置文件获取min和max的值
- String path = CrawlerDemo.class.getClassLoader().getResource("com/baizhan/crawler/Crawler.xml").getPath();
- Document d = Jsoup.parse(new File(path),"utf-8");
- min = Integer.parseInt(d.getElementsByTag("min").get(0).text());
- max = Integer.parseInt(d.getElementsByTag("max").get(0).text());
- for (int i = min; i <= max; i++){
- try{
- //通过Jsoup获取网络资源
- Document document = Jsoup.parse(new URL("http://daily.zhihu.com/story/"+i),5000);
- //System.out.println(document);
- //获取需要的Element对象
- Elements headerImgEle = document.getElementsByAttributeValue("alt","头图");
- Elements title = document.select(".DailyHeader-title");
- Elements authorEle = document.select(".author");
- Elements content = document.select(".content");
- //获取Element对象的数据
- System.out.println(headerImgEle.get(0).attr("src"));
- System.out.println(title.get(0).text());
- System.out.println(authorEle.get(0).text());
- System.out.println(content.get(0).text());
- System.out.println(i);
- }catch (Exception e){}
- }
- }
- }
然后通过配置文件定义min和max标签,在类中直接读取标签就行了