JavaWeb开发 XML技术详解

目录

一、XML

1.1 XML概述 

概念

发展历程

二、XML功能

2.1 配置文件

2.2 传输数据

2.3 XML和HTML的区别

三、XML基本语法

四、XML组成部分

4.1 文档声明

4.2 标签

4. 3 指令(了解)

4.4 属性

4.5 文本

五、约束

5.1 DTD约束

5.2 Schema约束(了解)

六、 Jsoup解析器

6.1 xml解析思想

DOM

SAX

6.2 XML常见解析器

6.3 Jsoup解析器

6.3.1 Jsoup对象详解

6.3.2 Document对象详解

6.4 Xpath解析

七、XML案例 网络爬虫


一、XML

1.1 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写前端页面?

因为程序员松散惯了,不想写很严格的代码。同样挣一万块钱,谁会从每月上一天班的公司跳槽到996的公司呢?

二、XML功能

2.1 配置文件

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

日后编写大型项目,不可能从头到尾都是原创代码,很多功能前人已经写好,我们只需要使用前人写好的半成品软件(框架),再加入一些符合我们需求的配置即可完成开发。

比如我们组装一台电脑,不可能自己焊接电路板。而是先买入一块主板,这块主板就是半成品软件。根据自己的需求加入一些配置,比如要求流畅运行吃鸡,就需要配置i7处理器、泰坦显卡。

2.2 传输数据

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

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

2.3 XML和HTML的区别

  1. XML语法严格,HTML语法松散
  2. XML标签自定义,HTML标签预定义

三、XML基本语法

  • 文件后缀名是.xml
  • 第一行必须是文档声明
  • 有且仅有一个根标签
  • 标签必须正确关闭
  • 标签名区分大小写
  • 属性值必须用引号(单双都可)引起来

四、XML组成部分

4.1 文档声明

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

<?xml 属性列表 ?>

属性列表:

  • version:版本号(必须,一般是1.0)
  • encoding:编码方式(默认utf-8)

4.2 标签

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

  • 包含数字、字母、其他字符
  • 不能以数字和标点符号开头,可以以_开头
  • 不能包含空格

4. 3 指令(了解)

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

<?xml-stylesheet type="text/css" href="a.css" ?>

4.4 属性

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

4.5 文本

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

<![CDATA[文本]]>

五、约束

5.1 DTD约束

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

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

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

本地引入:

<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">

网络引入:

<!DOCTYPE 根标签名 PUBLIC "dtd文件的位置" "dtd文件路径">
<!ELEMENT students (student*) >  //表示根标签是students,有多个student子标签
<!ELEMENT student (name,age,sex)>  //表示子标签student的属性有name、age、sex
<!ELEMENT name (#PCDATA)>    //表示name的数据类型是纯文本
<!ELEMENT age (#PCDATA)>     
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>   //表示student中的属性number是唯一的,而且是必须的
<?xml version="1.0" ?>
<!DOCTYPE students SYSTEM "student.dtd" >  <!--引入dtd约束文件-->
<students>
    <student number="zs">
        <name>张三</name>
        <age>12</age>
        <sex>男</sex>
    </student>
    <student number="ls">
        <name>李四</name>
        <age>14</age>
        <sex>女</sex>
    </student>
</students>

5.2 Schema约束(了解)

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

  1. 写xml文档的根标签

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

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

    3.引入Schema文件

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

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

xmlns:前缀="Schema文件定义的命名空间"
<students
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.itbaizhan.cn/xml student.xsd"
    xmlns="http://www.itbaizhan.cn/xml">

六、 Jsoup解析器

6.1 xml解析思想

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

DOM

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

  • 优点:操作方便,可以对文档进行CRUD的所有操作
  • 缺点:占内存

SAX

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

  • 优点:不占内存,一般用于手机APP开发中读取XML
  • 缺点:只能读取,不能增删改

6.2 XML常见解析器

  • JAXP:SUN公司提供的解析器,支持DOM和SAX两种思想
  • DOM4J:一款非常优秀的解析器
  • Jsoup:Jsoup是一款Java的HTML解析器,支持DOM思想。可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过CSS以及类似于jQuery的操作方法来取出和操作数据
  • PULL:Android操作系统内置的解析器,支持SAX思想

6.3 Jsoup解析器

步骤:

  1. 导入jar包
  2. 加载XML文档进内存,获取DOM树对象Document
  3. 获取对应的标签Element对象
  4. 获取数据
<?xml version="1.0" ?>
        <!DOCTYPE students SYSTEM "student.dtd" >  <!--引入dtd约束文件-->
<students>
<student id="zs">
    <name>张三</name>
    <age>12</age>
    <sex>男</sex>
</student>
<student id="ls">
    <name>李四</name>
    <age>14</age>
    <sex>女</sex>
</student>
</students>
package com.it.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;

//获取xml中所有学生的姓名
public class Jsoup1 {
    public static void main(String[] args) throws IOException {

        //2.通过类加载器找到xml文件,通过Jsoup加载文件到内存,将文件解析为DON对象Document
        ClassLoader classLoader = Jsoup1.class.getClassLoader();
        String path = classLoader.getResource("com/it/xsd/student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.获取对应的标签Element
        Elements names = document.getElementsByTag("name");
        //4.获取数据
        for (Element name : names) {
            String text = name.text();
            System.out.println(text);
        }
    }
}

 Jsoup对象:加载xml文档进内存并且转换成Document对象

Document对象:获取标签对象Element

Element对象:获取标签中的数据对象

6.3.1 Jsoup对象详解

常用方法:

  • static Document parse(File in, String charsetName):解析本地文件
  • static Document parse(String html):解析html或xml字符串
  • static Document parse(URL url, int timeoutMillis):解析网页源文件
<?xml version="1.0" ?>
        <!DOCTYPE students SYSTEM "student.dtd" >  <!--引入dtd约束文件-->
<students>
<student id="zs">
    <name>张三</name>
    <age>12</age>
    <sex>男</sex>
</student>
<student id="ls">
    <name>李四</name>
    <age>14</age>
    <sex>女</sex>
</student>
</students>
package com.it.Jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.File;
import java.io.IOException;
import java.net.URL;

/*Jsoup使用*/
public class Jsoup2 {
    public static void main(String[] args) throws IOException {
        //1、解析本地xml文件
        String path = Jsoup2.class.getClassLoader().getResource("com/it/xsd/student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "UTF-8");
        System.out.println(document);
        System.out.println("--------------------------------");
        // 解析字符串
        Document document1 = Jsoup.parse("<?xml version=\"1.0\" ?>\n" +
                "<students\n" +
                "     xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
                "     xsi:schemaLocation=\"http://www.itbaizhan.cn/xml student.xsd\"\n" +
                "     xmlns=\"http://www.itbaizhan.cn/xml\">\n" +
                "\n" +
                "   <student number=\"baizhan_0001\">\n" +
                "     <name>baizhan</name>\n" +
                "     <age>10</age>\n" +
                "     <sex>male</sex>\n" +
                "   </student>\n" +
                "   <student number=\"baizhan_0002\">\n" +
                "     <name>sxt</name>\n" +
                "     <age>11</age>\n" +
                "     <sex>female</sex>\n" +
                "   </student>\n" +
                "</students>");
        System.out.println(document1);
        System.out.println("---------------------------------");
        // 解析网络资源
        Document document2 = Jsoup.parse(new URL("https://www.baidu.com"), 2000);
        System.out.println(document2);
    }
}

6.3.2 Document对象详解

常用方法:

  • Element getElementById(String id):根据id获取元素
  • Elements getElementsByTag(String tagName):根据标签名获取元素
  • Elements getElementsByAttribute(String key):根据属性获取元素
  • Elements getElementsByAttributeValue(String key,String value):根据属性名=属性值获取元素。
  • Elements select(Sting cssQuery):根据选择器选取元素。
<!ELEMENT students (student*) >
        <!ELEMENT student (name,age,sex)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT sex (#PCDATA)>
        <!ATTLIST student id ID #REQUIRED>
        <!ATTLIST name english>
<?xml version="1.0" ?>
        <!DOCTYPE students SYSTEM "student.dtd" >  <!--引入dtd约束文件-->
<students>
<student id="user1">
    <name english="zs">张三</name>
    <age>12</age>
    <sex>男</sex>
</student>
<student id="user2">
    <name english="ls">李四</name>
    <age>14</age>
    <sex>女</sex>
</student>
</students>
package com.it.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;

/*Document对象使用*/
public class Jsoup3 {
    public static void main(String[] args) throws IOException {
        String path = Jsoup3.class.getClassLoader().getResource("com/it/XML/student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //1.根据id获取元素
        Element user1 = document.getElementById("user1");
        System.out.println(user1);
        System.out.println("--------------------------------");
        //2.根据标签获取元素
        Elements age = document.getElementsByTag("age");
        for (Element element : age) {
            System.out.println(element);
        }
        System.out.println("--------------------------------");
       //3.根据属性获取元素
        Elements english = document.getElementsByAttribute("english");
        for (Element element : english) {
            System.out.println(element);
        }
        System.out.println("--------------------------------");
        //4.根据属性名=属性值获取元素
        Elements elementsByAttributeValue = document.getElementsByAttributeValue("english", "ls");
        for (Element element : elementsByAttributeValue) {
            System.out.println(element);
        }
        System.out.println("--------------------------------");
        //5.使用css选择器获取元素
        Elements select = document.select("#user2");//根据id获取元素
        System.out.println(select);
        Elements sex = document.select("sex"); //根据标签获取元素
        for (Element element : sex) {
            System.out.println(element);
        }

    }
}

   控制台输出

<student id="user1"> 
 <name english="zs">
  张三
 </name> 
 <age>
  12
 </age> 
 <sex>
  男
 </sex> 
</student>
--------------------------------
<age>
 12
</age>
<age>
 14
</age>
--------------------------------
<name english="zs">
 张三
</name>
<name english="ls">
 李四
</name>
--------------------------------
<name english="ls">
 李四
</name>
--------------------------------
<student id="user2"> 
 <name english="ls">
  李四
 </name> 
 <age>
  14
 </age> 
 <sex>
  女
 </sex> 
</student>
<sex>
 男
</sex>
<sex>
 女
</sex>

6.3.3 Element对象详解

Element: 元素对象

常用方法:

  • String text():获取元素包含的纯文本。
  • String html():获取元素包含的带标签的文本。
  • String attr(String attributeKey):获取元素的属性值。
package com.it.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 Jsoup4 {
    public static void main(String[] args) throws IOException {
        String path = Jsoup4.class.getClassLoader().getResource("com/it/XML/student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //1.根据css获取元素
        Elements select = document.select("#user1");
        Element element = select.get(0); //获取第一个元素
        System.out.println("------------------------------------------------");
        System.out.println(element.text()); //第一个元素的纯文本
        System.out.println("------------------------------------------------");
        System.out.println(element.html()); //第一个元素的html
        System.out.println("-----------------------------------------------");
        System.out.println(element.attr("id")); //第一个元素的属性

    }
}

------------------------------------------------
张三 12 男
------------------------------------------------
<name english="zs">
 张三
</name> 
<age>
 12
</age> 
<sex>
 男
</sex>
-----------------------------------------------
user1

6.4 Xpath解析

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

使用方法:

  1. 导入Xpath的jar包
  2. 获取Document对象
  3. Document对象转为JXDocument对象
  4. JXDocument调用selN(String xpath),获取List<JXNode>对象。
  5. 遍历List<JXNode>,调用JXNodegetElement(),转为Element对象。
  6. 处理Element对象。
package com.it.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 org.jsoup.nodes.Element;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class Xpath {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        //2.获取Document对象
        String path = Xpath.class.getClassLoader().getResource("com/it/XML/student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.将Document转为JXDocument对象
        JXDocument jxDocument = new JXDocument(document);
        //4.JXDocument调用selN(String xpath),获取List<JXNode>对象。
        List<JXNode> jxNodes = jxDocument.selN("//name");//获取所有name标签
        List<JXNode> jxNodes1 = jxDocument.selN("//student[@id=user1]/age");//获取属性是id=user1的student标签的子元素age
        //5.遍历List<JXNode>,调用JXNode的getElement(),转为Element对象。
        for (JXNode jxNode : jxNodes) {
            //6.处理Element对象.
            Element element = jxNode.getElement();
            System.out.println(element);
        }
        System.out.println("--------------------------------");
        for (JXNode jxNode : jxNodes1) {
            Element element = jxNode.getElement();
            System.out.println(element);
        }
    }
}
<name english="zs">
 张三
</name>
<name english="ls">
 李四
</name>
--------------------------------
<age>
 12
</age>

七、XML案例 网络爬虫

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

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

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

爬虫步骤:

  1. 引入jar包。
  2. 使用Jsoup获取网页HTML源文件,转为Document对象
  3. 通过Document对象,获取需要的Element对象
  4. 获取Element对象的数据。
  5. 设置循环自动爬取

爬取知乎日报的数据

<?xml version="1.0"?>
<Crawler>
    <min>9734020</min>
    <max>9734346</max>
</Crawler>
package com.it.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.URL;

public class Crawler {

    public static void getInfo(int i) throws IOException {

        //2.使用Jsoup获取网页HTML源文件,转为Document对象
        Document document = Jsoup.parse(new URL("http://daily.zhihu.com/story/"+i), 3000);

        //3.通过Document对象,获取需要的Element对象
        //根据属性获取图片
        Elements pic = document.getElementsByAttributeValue("alt", "头图");
        //获取文章标题
        Elements title = document.select(".DailyHeader-title");
        //获取文章作者
        Elements author = document.select(".author");
        //获取文章正文
        Elements content = document.select(".content");

        //4.获取Element对象的数据。
        String src = pic.get(0).attr("src");
        System.out.println(src);
        String text = title.get(0).text();
        System.out.println(text);
        String au = author.get(0).text();
        System.out.println(au);
        String con = content.get(0).text();
        System.out.println(con);
        System.out.println("--------------------------------");
    }
    public static void main(String[] args) throws IOException {
        //5.读取配置文件设置循环自动爬取
        String path = Crawler.class.getClassLoader().getResource("com/it/Jsoup/Crawler.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        Elements min = document.getElementsByTag("min");
        Elements max = document.getElementsByTag("max");
        for (int i = Integer.parseInt(min.get(0).text()); i <= Integer.parseInt(max.get(0).text());i++){
            try {
                getInfo(i);
            } catch (Exception e) {
                System.out.println("爬取失败:"+e.getMessage());
            }
        }
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小猿ε٩(๑> ₃ <)۶ з

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值