XML技术

XML概述

XML(Extensible Markup Language):可扩展标记语言

可扩展:标签都是自定义的。

发展历程

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

XML的功能

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

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

XML和HTML的区别

  • XML语法严格,HTML语法松散
  • XML标签自定义,HTML标签预定义

XML基本语法

在这里插入图片描述

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

XML组成部分

在这里插入图片描述

文档声明

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

<?xml 属性列表 ?>

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

标签

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

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

指令

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

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

属性

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

文本

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

<![CDATA[文本]]>

约束_DTD约束

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

XML有两种约束文件类型:DTD和Schema。

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

  1. 本地引入:

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

2.网络引入:

< !DOCTYPE 根标签名 PUBLIC “dtd文件的位置” “dtd文件路径”>

约束_Schema约束

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

  1. 写xmi文档的根标签
  2. 引入xsl前缀:确定Schema文件的版本。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  1. 引入Schema文件
xsi:schemaLocation="Schema文件定义的命名空间 Schema文件的具体路径"
  1. 为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解析器_XML解析思想

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

DOM

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

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

缺点:占内存

在这里插入图片描述

SAX

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

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

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

在这里插入图片描述

Jsoup解析器_XML常见解析器

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

Jsoup解析器_Jsoup快速入门

步骤:

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

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):解析网页源文件
public class Demo2 {    
// Jsoup    
public static void main(String[] args) throws IOException {        
// 解析本地XML        
String path = Demo2.class.getClassLoader().getResource("com/itbaizhan/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);    
    }
 }

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):根据选择器选取元素。
public class Demo3 {    
// Document
 public static void main(String[] args) throws IOException {        
   String path =Demo3.class.getClassLoader().getResource("com/itbaizhan/jsoup/student.xml").getPath();        
   Document document = Jsoup.parse(new File(path), "utf-8");
    // 根据id获取元素        
    Element baizhan_0001 = document.getElementById("baizhan_0001");                                                                          System.out.println(baizhan_0001);        
    System.out.println("----------------------");
    // 根据标签获取元素        
    Elements age = document.getElementsByTag("age");        
    for (Element element : age) {            
    System.out.println(element);        
    }        
    System.out.println("----------------------");
    // 根据属性获取元素        
    Elements english = document.getElementsByAttribute("english");        
    for (Element element : english) {            
    System.out.println(element);        }
    System.out.println("----------------------");
     // 根据属性名=属性值获取元素        
     Elements elementsByAttributeValue = document.getElementsByAttributeValue("english", "bz");        
     for (Element element : elementsByAttributeValue) {               System.out.println(element);        
     }        
     System.out.println("----------------------");
     // 使用CSS选择器获取元素        
     Elements select = document.select("#baizhan_0001");            System.out.println(select);        
     System.out.println("----------------------");       
     Elements sex = document.select("sex");        
     System.out.println(sex);        
     System.out.println("----------------------");        
     Elements select1 = document.select(".aa");        System.out.println(select1);    }}

Jsoup解析器_Element

Element: 元素对象

常用方法:

  • String text():获取元素包含的纯文本。
  • String html():获取元素包含的带标签的文本。
  • String attr(String attributeKey):获取元素的属性值。
public class Demo4 {    
// Document    
public static void main(String[] args) throws IOException {        
String path = Demo4.class.getClassLoader().getResource("com/itbaizhan/jsoup/student.xml").getPath();        
Document document = Jsoup.parse(new File(path), "utf-8");
 // 使用CSS选择器获取元素        
Elements elements = document.select("#baizhan_0001");       
Element element = elements.get(0);        
System.out.println(element.text());
System.out.println("-----------------------");          System.out.println(element.html());       
System.out.println("-----------------------");        System.out.println(element.attr("id"));    }}

Jsoup解析器_XPath解析

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

使用方法:

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

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

网络爬虫(web crawler):自动抓取互联网信息的程序。
比如我们要开发一个网站,在网页的右上角需要显示今日天气,如果人工查询天气预报维护非常繁琐,我们就可以使用爬虫程序自动爬取天气网站的程序,自动更新。
在这里插入图片描述
Jsoup可以通过URL获取网页的HTML源文件,源文件中包含着网站数据,我们可以解析HTML源文件的数据来获取我们需要的信息。
爬虫步骤:

  1. 引入jar包。
  2. 使用Jsoup获取网页HTML源文件,转为Document对象
  3. 通过Document对象,获取需要的Element对象
  4. 获取Element对象的数据。
  5. 设置循环自动爬取
public class CrawlerDemo {    
public static void main(String[] args) {        
int min = 9734020;        
int max = 9734346;                
// 循环爬取数据        
for (int i = min; i <= max; i++) {            
try {                
//1. 使用Jsoup获取网页HTML源文件,转为Document对象                
Document document = Jsoup.parse(new URL("http://daily.zhihu.com/story/"+i), 3000);                
//        System.out.println(document);                
//2. 通过Document对象,获取需要的Element对象                
Elements headerImgEle = document.getElementsByAttributeValue("alt", "头图");                Elements titleEle = document.select(".DailyHeader-title");                Elements authorEle = document.select(".author");
  Elements contentELe = document.select(".content");                
  //3. 获取Element对象的数据。  
 System.out.println(headerImgEle.get(0).attr("src"));                System.out.println(titleEle.get(0).text());                System.out.println(authorEle.get(0).text());                System.out.println(contentELe.get(0).text());            
 }catch (Exception e){}        
  }    
 }
}

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

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

  1. 编写爬虫程序的XML配置文件 Crawler.xml
<?xml version="1.0"?>
<Crawler>    
   <min>9734020</min>    
   <max>9734346</max>
</Crawler>

2.编写爬虫程序

public class CrawlerDemo {    
public static void main(String[] args) throws IOException {        
int min = 0;        
int max = 0;        
// 解析XML配置文件        
String path = CrawlerDemo.class.getClassLoader().getResource("com/itbaizhan/crawler/Crawler.xml").getPath();        
Document document1 = Jsoup.parse(new File(path), "utf-8");        
Elements minELe = document1.getElementsByTag("min");        
Elements maxELe  = document1.getElementsByTag("max");        
min = Integer.parseInt(minELe.get(0).text());        
max = Integer.parseInt(maxELe.get(0).text());
// 循环爬取数据        
for (int i = min; i <= max; i++) {            
try {                
//1. 使用Jsoup获取网页HTML源文件,转为Document对象                
Document document = Jsoup.parse(new URL("http://daily.zhihu.com/story/"+i), 3000);
      //        System.out.println(document);                
      //2. 通过Document对象,获取需要的Element对象                
      Elements headerImgEle = document.getElementsByAttributeValue("alt", "头图");                
      Elements titleEle = document.select(".DailyHeader-title");                Elements authorEle = document.select(".author");                
      Elements contentELe = document.select(".content");                
      //3. 获取Element对象的数据。          
 System.out.println(headerImgEle.get(0).attr("src"));                System.out.println(titleEle.get(0).text());                System.out.println(authorEle.get(0).text());                System.out.println(contentELe.get(0).text());            
 }catch (Exception e){}        }    }}
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值