JavaWeb - XML

1.XML介绍

  1.概念:Extensible Markup Language 可扩展标记语言

    *可扩展:标签都是自定义的。<user> <student>

  2.功能:

    *存储数据

      1.配置文件

      2.在网络中传输

  3.与html的区别

    1.xml标签都是自定义的,html标签时预定义的

    2.xml的语法严格

    3.xml是存储数据的,html是展示数据的

   *W3C:万维网联盟

 

2.语法快速入门

  *基本语法:

    1. xml文档的后缀名 .xml

    2. xml第一行必须定义为文档声明!!

    3. xml文档中有且仅有一个根标签

    4. 属性值必须使用引号 单双引号都行

    5. 标签必须正确关闭

    6. xml标签名称区分大小写

  *组成部分:

    1.文档声明

      1.格式 <?xml 属性列表 ?>

      2.属性列表:

        *version:版本号,必须的属性

        *encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1

        *standalong:是否独立  取值:yes或者no  是否依赖其他文件

    2.指令(了解):结合css的

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

    3.标签:标签名称自定义

      规则:

        1.数字、标点符号不能开头

        2.名称不能以xml开头

        3.名称不能包含空格

    4.属性:id属性值唯一

    5.文本:

      * CDATA区:在该区域中的数据会被原样展示

        * 格式:<!【CDATA】【数据】>

 

  3.约束:规定xml文档的书写规则

    * 作为框架的使用者(程序员):

      1.能够在xml中引入约束文档

      2.能够简单的读懂约束文档

    *分类:  

      1.DTD:一种简单的约束技术

      2.Schema:一种复杂的约束技术 后缀名xsd

    *DTD:

      * 引入DTD文档到xml文档中

        *内部dtd:将约束规则定义在xml文档中

        *外部dtd:将约束的规则定义在外部的dtd文件中

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

          *网络的:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">

    *Schema:

      <!--
        1.填写xml文档的根元素
        2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        3.引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
        4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml" 此为默认情况
                            xmlns:a="http://www.itcast.cn/xml" 这样表示a为其缩略名
      -->
     <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"
     >

 

3.解析XML文档

  1.操作xml文档,将文档中的数据读取到内存中

    1.解析(读取):将文档中的数据读取到内存中

    2.写入:将内存中的数据保存到xml文档中。持久化存储

  2.解析xml的方式:

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

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

      *缺点:占内存

    2.SAX:逐行读取,基于事件驱动的。

      *优点:不占内存

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

  3.XML常见的解析器

    1.JAXP :sun公司提供的解析器,支持dom和sax两种思想

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

    3.Jsoup :java的html解析器

    4.PULL :Android操作系统内置的解析器,sax方式

 

  4.Jsoup

    *快速入门:

      *步骤:

        1.导入jar包

        2.获取Document对象

        3.获取对应的标签Element对象

        4.获取数据

package XML_Document.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 Jsoup_Demo01 {
    public static void main(String[] args) throws IOException {
        //获取document对象,根据xml获得
        //2.1通过类加载器获取myxml的path
        String path = Jsoup_Demo01.class.getClassLoader().getResource("XML_Document/myxml.xml").getPath();
        //2.2 解析xml文档 加载文档进内存,获取dom数 - -  > Document
        Document document = Jsoup.parse(new File(path), "utf-8");

        //3.获取元素对象
        Elements elements = document.getElementsByTag("name");

        //4.获取第一个name的element对象
        Element element = elements.get(0);
        //获取数据
        System.out.println(element.text());
    }
}
快速入门

 

  5.对象的使用

    1. Jsoup :工具类,可以去解析html或xml文档,返回document对象

      * parse :解析html和xml文档,返回Document

        * parse(File in , String CharsetName): 解析html和xml文件的

        * parse(String html):解析字符串

        * parse(URL url , int TimeoutMillis):通过网络路径获取指定的html或xml的文档对象  以后可以用于爬虫爬取html

    2. Document :文档对象,代表内存中的dom树

      *获取Element对象

        *getElementById(String id):根据id属性值获取唯一的Element对象

        *getElementsByTag(String tagName):根据标签名称获取元素对象集合

        *getElementsByAttribute(String key):根据属性名称获取元素对象集合

        *getElementsByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合

 

 

 

    3. Elements :元素Element对象的集合。可以把它当做一个Arraylist<Element>来使用

    4. Element :元素对象

      1.获取子元素对象

      2.获取属性值

        * String attr(String key):根据属性名称获取属性值

      3.获取文本内容

        * String text():获取所有子标签的纯文本内容

        *String html():获取标签体的所有内容(包括子标签的标签和文本字符串内容)

    5. Node : 节点对象

      *是Document和Element的父类

 

package XML_Document.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 Jsoup_Demo02 {
    public static void main(String[] args) throws IOException {
        String path = Jsoup_Demo01.class.getClassLoader().getResource("XML_Document/myxml.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");

        //这是通过document来获取name标签,可以获取到两个
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements);

        //先获取第一个student元素,然后通过element对象获取其子标签name,此时获取到1个
        Element element_student01 = document.getElementsByTag("student").get(0);
        Elements name = element_student01.getElementsByTag("name");
        System.out.println(name);
        System.out.println(name.text());

        //获取student对象的属性值
        String number = element_student01.attr("number");
        System.out.println(number);
    }
}
Element使用

 

 4.快捷查询方式

  1.selector:选择器

    *使用的方法:Elements select(String cssQuery)

      语法:参考Selector类中定义的语法

package XML_Document.Jsoup;

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

import java.io.File;
import java.io.IOException;

public class Jsoup_Demo03 {
    public static void main(String[] args) throws IOException {
        String path = Jsoup_Demo01.class.getClassLoader().getResource("XML_Document/myxml.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");

        //根据选择器来查找

        //1.查找所有name标签
        Elements name = document.select("name");

        //2.查找id值为3
        Elements tag = document.select("#s002");
//        System.out.println(tag);

        //获取student标签里number为s002的age子标签
        Elements elements_student = document.select("student[number=\"s002\"]");
        System.out.println(elements_student);
        Elements elements_student_age = document.select("student[number=\"s002\"] > age");
        System.out.println("==============");
        System.out.println(elements_student_age);
    }
}
选择器使用

 

  2.XPath:XPath既为XML路径语言

    * 使用Jsoup的XPath需要额外导入jar包,且要查询W3Cschool参考手册,来完成查询

 

package XML_Document.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.select.Elements;

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

public class Jsoup_Demo04 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        String path = Jsoup_Demo01.class.getClassLoader().getResource("XML_Document/myxml.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");

        //根据document对象,创建JXDocument对象(因为他支持java语法)
        JXDocument jxDocument = new JXDocument(document);

        //4.结合XPath语法查询
        //查询所有的student标签
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }

        System.out.println("==========");
        //查询所有student标签下的name标签
        List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes1) {
            System.out.println(jxNode);
        }

        //查询student标签下带有id属性的name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }

        //查询student标签下带有id属性的name标签 并且id属性值为itcast
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='001']");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
    }
}
XPath基本使用

 

posted @ 2020-07-09 22:15  五号世界  阅读(150)  评论(0编辑  收藏  举报