• 可扩展标记语言-----XML


    目录

    XML概述

     概念

     发展历程

     XML的功能

     XML基本语法

     XML组成部分

     文档声明

     标签

     指令(了解)

    属性

    文本

    约束_DTD约束

    ​编辑

    约束_Schema约束

    Jsoup解析器_XML解析思想

    DOM

     SAX

     Jsoup解析器_XML常见解析器

     Jsoup解析器_Jsoup快速入门

     步骤:

     Jsoup解析器_Jsoup

    Jsoup解析器_Document

    Jsoup解析器_Element

    Jsoup解析器_XPath解析

     XML案例_使用Jsoup完成网页爬虫

     XML案例_使用XML配置爬虫程序的参数


    XML概述

     概念

    XML(Extensible Markup Language):可扩展标记语言 可扩展:标签都是自定义的。

     发展历程

    HTML和XML都是W3C(万维网联盟)制定的标准,最开始HTML的 语法过于松散,于是W3C制定了更严格的XML语法标准,希望能取 代HTML。但是程序员和浏览器厂商并不喜欢使用XML,于是现在 的XML更多的用于配置文件及传输数据等功能。

    是谁造成的HTML语法松散?

    浏览器厂商。最开始W3C制定HTML的时候语法还是比较严格 的。但浏览器厂商为了抢占市场,语法错误也可以解析成功 HTML,最后“内卷”到HTML即使语法非常混乱也是可以被浏览 器解析。

     

     tips:归根到底是语法的制定者和使用者不一致造成了HTML语 法混乱,JAVA语法严格就是因为java语言的运行工具java虚拟机 也是sun公司(现在是oracle)出品的,语法不通过不让运行。

     XML的功能

    1 配置文件:在今后的开发过程当中我们会频繁使用框架(框架: 半成品软件),使用框架时,需要写配置文件配置相关的参数, 让框架满足我们的开发需求。而我们写的配置文件中就有一种文 件类型是XML。

    日后编写大型项目,不可能从头到尾都是原创代码,很多功 能前人已经写好,我们只需要使用前人写好的半成品软件 (框架),再加入一些符合我们需求的配置即可完成开发。 比如我们组装一台电脑,不可能自己焊接电路板。而是先买 入一块主板,这块主板就是半成品软件。根据自己的需求加 入一些配置,比如要求流畅运行吃鸡,就需要配置i7处理 器、泰坦显卡。

     2 传输数据:在网络中传输数据时并不能传输java对象,所以我们 需要将JAVA对象转成字符串传输,其中一种方式就是将对象转为 XML类型的字符串。

    比如携程等旅游网站可以买火车票,但他们其实也是替 12306卖票,此时他们就需要拿到12306的票务数据。JAVA 对象不能在网络上传输,可以转为XML类型的字符串。

     XML和HTML的区别

    1 XML语法严格,HTML语法松散

    2 XML标签自定义,HTML标签预定义

     XML基本语法

    1、文件后缀名是.xml

    2、第一行必须是文档声明

    3、有且仅有一个根标签

    4、标签必须正确关闭

    5、标签名区分大小写

    6、属性值必须用引号(单双都可)引起来

     XML组成部分

     文档声明

    文档声明必须放在第一行,格式为:

    属性列表: version:版本号(必须) encoding:编码方式

     标签

    XML中标签名是自定义的,标签名有以下要求:

    1、包含数字、字母、其他字符

    2、不能以数字和标点符号开头,可以以_开头

    3、不能包含空格

     指令(了解)

    指令是结合css使用的,但现在XML一般不结合CSS,语法为:

    "text/css" href="a.css"?>

    属性

    属性值必须用引号(单双都可)引起来

    文本

    如果想原样展示文本,需要设置CDATA区,格式为:

    约束_DTD约束

     虽然XML标签是自定义的。但是作为配置文件时,也需要遵循一定 的规则。就比如在主板上硬盘口只能插硬盘,不能插入其他硬件。 约束就是定义XML书写规则的文件,约束我们按照框架的要求编写 配置文件。

     我们作为框架的使用者,不需要会写约束文件,只要能够在xml中 引入约束文档,简单的读懂约束文档即可。XML有两种约束文件类 型:DTD和Schema。

    DTD是一种较简单的约束技术,引入方式如下:

    本地引入:

    SYSTEM "dtd文件的位置">

    网络引入:

    PUBLIC "dtd文件的位置" "dtd文件路径">

    约束_Schema约束

     Schema比DTD对XML的约束更加详细,引入方式如下:

    1 写xml文档的根标签

    2 引入xsi前缀:确定Schema文件的版本。

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    3 引入Schema文件

    1. xsi:schemaLocation="Schema文件定义的命名空间
    2. Schema文件的具体路径"

    4 为Schema约束的标签声明前缀

    xmlns:前缀="Schema文件定义的命名空间"
    

    例如:

    1. <students
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
    3. xsi:schemaLocation="http://www.itbaizhan.cn/xml student.xsd"
    4. xmlns="http://www.itbaizhan.cn/xml">

    Jsoup解析器_XML解析思想

     XML解析即读写XML文档中的数据。框架的开发者通过XML解析读 取框架使用者配置的参数信息,开发者也可以通过XML解析读取网 络传来的数据。XML有如下解析思想:

    DOM

    将标记语言文档一次性加载进内存,在内存中形成一颗dom树

    优点:操作方便,可以对文档进行CRUD的所有操作

    缺点:占内存

     

     SAX

    逐行读取,基于事件驱动的。

    优点:不占内存,一般用于手机APP开发中读取XML

    缺点:只能读取,不能增删改

     

     Jsoup解析器_XML常见解析器

    1、JAXP:SUN公司提供的解析器,支持DOM和SAX两种思想

    2、DOM4J:一款非常优秀的解析器

    3、Jsoup:Jsoup是一款Java的HTML解析器,支持DOM思想。可直接解析某个URL地址、HTML文本 内容。它提供了一套非常省力的API,可通过CSS以及类似于jQuery的操作方法来取出和操作数据

    4、PULL:Android操作系统内置的解析器,支持SAX思想

     Jsoup解析器_Jsoup快速入门

     步骤:

    1 导入jar包

    2 加载XML文档进内存,获取DOM树对象Document

    3 获取对应的标签Element对象

    4 获取数据

    1. public class Demo1 {
    2. // 获取XML中所有学生的姓名
    3. public static void main(String[] args) throws IOException {
    4. // 2.加载XML文档进内存。获取DOM树对象Document
    5. // 2.1 获取类加载器
    6. ClassLoader classLoader = Demo1.class.getClassLoader();
    7. // 2.2使用类加载器,找到XML文档的路径
    8. String path = classLoader.getResource("com/itbaizhan/xsd/student.xml").getPath();
    9. // 2.3加载XML文档进内存,并转成Document对象
    10. Document document = Jsoup.parse(new File(path), "utf-8");
    11. // 3.获取对应的标签Element对象
    12. Elements name = document.getElementsByTag("name");
    13. // 4.获取数据
    14. for (Element element : name) {
    15. String text = element.text();
    16. System.out.println(text);
    17. }
    18. }
    19. }

     Jsoup解析器_Jsoup

     Jsoup:可以解析xml或html,形成dom树对象。

    常用方法:

    static Document parse(File in, String charsetName):解析本地文件

    static Document parse(String html):解析html或xml字符串

    static Document parse(URL url, int timeoutMillis):解析网页源文件

    1. public class Demo2 {
    2. // Jsoup
    3. public static void main(String[] args) throws IOException {
    4. // 解析本地XML
    5. String path = Demo2.class.getClassLoader().getResource("com/itbaizhan/xsd/student.xml").getPath();
    6. Document document = Jsoup.parse(new File(path), "utf-8");
    7. System.out.println(document);
    8. System.out.println("------------------");
    9. // 解析字符串
    10. Document document1 = Jsoup.parse("1.0\" ?>\n" +
    11. " +
    12. " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
    13. " xsi:schemaLocation=\"http://www.itbaizhan.cn/xml student.xsd\"\n" +
    14. " xmlns=\"http://www.itbaizhan.cn/xml\">\n" + "\n" +
    15. " baizhan_0001\">\n" +
    16. " baizhan\n" +
    17. " 10\n" +" male\n"+
    18. " \n" +
    19. " baizhan_0002\">\n" +
    20. " sxt\n"+
    21. " 11\n" +
    22. " female\n" +
    23. " \n" +
    24. "");
    25. System.out.println(document1);
    26. System.out.println("---------------------------------");
    27. // 解析网络资源
    28. Document document2 = Jsoup.parse(new URL("https://www.baidu.com"), 2000);
    29. System.out.println(document2);
    30. }
    31. }

    Jsoup解析器_Document

     Document:xml的dom树对象

    常用方法:

    Element getElementById(String id):根据id获取元素

    Elements getElementsByTag(String tagName):根据标签名获取元素

    Elements getElementsByAttribute(String key):根据属性获取元素

    Elements getElementsByAttributeValue(String key,String value):根据属性名=属性值获取元 素。

    Elements select(Sting cssQuery):根据选择器选取元素。

    1. public class Demo3 {
    2. // Document
    3. public static void main(String[] args) throws IOException {
    4. String path = Demo3.class.getClassLoader().getResource("com/itbaizhan/jsoup/student.xml").getPath();
    5. Document document = Jsoup.parse(new File(path), "utf-8");
    6. // 根据id获取元素
    7. Element baizhan_0001 = document.getElementById("baizhan_0001");
    8. System.out.println(baizhan_0001);
    9. System.out.println("----------------------");
    10. // 根据标签获取元素
    11. Elements age = document.getElementsByTag("age");
    12. for (Element element : age) {
    13. System.out.println(element);
    14. }
    15. System.out.println("----------------------");
    16. // 根据属性获取元素
    17. Elements english = document.getElementsByAttribute("english");
    18. for (Element element : english) {
    19. System.out.println(element);
    20. }
    21. System.out.println("----------------------");
    22. // 根据属性名=属性值获取元素
    23. Elements elementsByAttributeValue =
    24. document.getElementsByAttributeValue("english", "bz");
    25. for (Element element : elementsByAttributeValue) {
    26. System.out.println(element);
    27. }
    28. System.out.println("----------------------");
    29. // 使用CSS选择器获取元素
    30. Elements select = document.select("#baizhan_0001");
    31. System.out.println(select);
    32. System.out.println("----------------------");
    33. Elements sex = document.select("sex");
    34. System.out.println(sex);
    35. System.out.println("----------------------");
    36. Elements select1 = document.select(".aa");
    37. System.out.println(select1);
    38. }
    39. }

    Jsoup解析器_Element

     Element: 元素对象

    常用方法:

    String text():获取元素包含的纯文本。

    String html():获取元素包含的带标签的文本。

    String attr(String attributeKey):获取元素的属性值。

    1. public class Demo4 {
    2. // Document
    3. public static void main(String[] args) throws IOException {
    4. String path = Demo4.class.getClassLoader().getResource("com/itbaizhan/jsoup/student.xml").getPath();
    5. Document document = Jsoup.parse(new File(path), "utf-8");
    6. // 使用CSS选择器获取元素
    7. Elements elements = document.select("#baizhan_0001");
    8. Element element = elements.get(0);
    9. System.out.println(element.text());
    10. System.out.println("-----------------------");
    11. System.out.println(element.html());
    12. System.out.println("-----------------------");
    13. System.out.println(element.attr("id"));
    14. }
    15. }

    Jsoup解析器_XPath解析

     XPath即为XML路径语言,它是一种用来确定标记语言文档中某部 分位置的语言。

    使用方法:

    1 导入 Xpath 的jar包 、

    2 获取 Document 对象

    3 将 Document 对象转为 JXDocument 对象

    4 JXDocument 调用 selN(String xpath) ,获取 List 对象。

    5 遍历 List ,调用 JXNode 的 getElement() ,转为 Element 对象。

    6 处理 Element 对象。

    1. public class Demo5 {
    2. // Document
    3. public static void main(String[] args) throws IOException, XpathSyntaxErrorException
    4. {
    5. String path = Demo5.class.getClassLoader().getResource("com/itbaizhan/jsoup/student.xml").getPath();
    6. // 1. 获取`Document`对象
    7. Document document = Jsoup.parse(new File(path), "utf-8");
    8. //2. 将`Document`对象转为`JXDocument`对象
    9. JXDocument jxDocument = newJXDocument(document);
    10. //3. `JXDocument`调用`selN(String xpath)`,获取`List<JXNode>`对象。
    11. // List<JXNode> jxNodes = jxDocument.selN("//name");
    12. // 想拿到baizhan_0001的年龄
    13. List<JXNode> jxNodes = jxDocument.selN("//student[@id='baizhan_0001']/age");
    14. //4. 遍历`List<JXNode>`,调用`JXNode`的`getElement()`,转为`Element`对象。
    15. for (JXNode jxNode : jxNodes) {
    16. Element element = jxNode.getElement();
    17. //5. 处理`Element`对象。
    18. System.out.println(element);
    19. }
    20. }
    21. }

     XML案例_使用Jsoup完成网页爬虫

     网络爬虫(web crawler):自动抓取互联网信息的程序。

    比如我们要开发一个网站,在网页的右上角需要显示今日天 气,如果人工查询天气预报维护非常繁琐,我们就可以使用爬 虫程序自动爬取天气网站的程序,自动更新。 

    Jsoup可以通过URL获取网页的HTML源文件,源文件中包含着网站 数据,我们可以解析HTML源文件的数据来获取我们需要的信息。 

    爬虫步骤:

    1 引入jar包。

    2 使用Jsoup获取网页HTML源文件,转为Document对象

    3 通过Document对象,获取需要的Element对象

    4 获取Element对象的数据。

    5 设置循环自动爬取

    1. public class CrawlerDemo {
    2. public static void main(String[] args) {
    3. int min = 9734020;
    4. int max = 9734346;
    5. // 循环爬取数据
    6. for (int i = min; i <= max; i++) {
    7. try {
    8. //1. 使用Jsoup获取网页HTML源文件,转为Document对象
    9. Document document = Jsoup.parse(new URL("http://daily.zhihu.com/story/"+i), 3000);
    10. // System.out.println(document);
    11. //2. 通过Document对象,获取需要的Element对象
    12. Elements headerImgEle = document.getElementsByAttributeValue("alt","头图");
    13. Elements titleEle = document.select(".DailyHeader-title");
    14. Elements authorEle = document.select(".author");
    15. Elements contentELe = document.select(".content");
    16. //3. 获取Element对象的数据。
    17. System.out.println(headerImgEle.get(0).attr("src"));
    18. System.out.println(titleEle.get(0).text());
    19. System.out.println(authorEle.get(0).text());
    20. System.out.println(contentELe.get(0).text());
    21. }catch (Exception e){}
    22. }
    23. }
    24. }

     XML案例_使用XML配置爬虫程序的参数

    爬虫程序有一些参数需要配置,如果直接将参数写在JAVA程序中, 则修改参数非常不方便,所以此时我们将参数写在XML配置文件 中,通过解析XML文件获取参数的配置信息。

     1 编写爬虫程序的XML配置文件 Crawler.xml

    1. <?xml version="1.0"?>
    2. <Crawler>
    3. <min>9734020</min>
    4. <max>9734346</max>
    5. </Crawler>

    2 编写爬虫程序

    1. public class CrawlerDemo {
    2. public static void main(String[] args) throws IOException {
    3. int min = 0;
    4. int max = 0;
    5. // 解析XML配置文件
    6. String path = CrawlerDemo.class.getClassLoader().getResource("com/itbaizhan/crawler/Crawler.xml").getPath();
    7. Document document1 = Jsoup.parse(new File(path), "utf-8");
    8. Elements minELe = document1.getElementsByTag("min");
    9. Elements maxELe = document1.getElementsByTag("max");
    10. min = Integer.parseInt(minELe.get(0).text());
    11. max = Integer.parseInt(maxELe.get(0).text());
    12. // 循环爬取数据
    13. for (int i = min; i <= max; i++) {
    14. try {
    15. //1. 使用Jsoup获取网页HTML源文件,转为Document对象
    16. Document document = Jsoup.parse(new URL("http://daily.zhihu.com/story/"+i), 3000);
    17. // System.out.println(document);
    18. //2. 通过Document对象,获取需要的Element对象
    19. Elements headerImgEle = document.getElementsByAttributeValue("alt", "头图");
    20. Elements titleEle =document.select(".DailyHeader-title");
    21. Elements authorEle =document.select(".author");
    22. Elements contentELe =document.select(".content");
    23. //3. 获取Element对象的数据。
    24. System.out.println(headerImgEle.get(0).attr("src"));
    25. System.out.println(titleEle.get(0).text());
    26. System.out.println(authorEle.get(0).text());
    27. System.out.println(contentELe.get(0).text());
    28. }catch (Exception e){}
    29. }
    30. }
    31. }

  • 相关阅读:
    Linux 进程概念和状态
    项目五 OpenStack镜像管理与制作
    如何使用 etcd 实现分布式 /etc 目录
    BadUsb程序大全-值得收藏
    【烹饪】清炒菠菜的学习笔记
    光伏发电站电能质量在线检测装置、防弧岛保护设备数据采集方案
    文献阅读4
    小程序中实现待办功能
    运行ORB-SLAM3,整体感觉还不错
    ERROR 1045 (28000) Access denied for user ‘root‘@‘localhost‘解决方法
  • 原文地址:https://blog.csdn.net/m0_58719994/article/details/127994329