JavaWeb——XML入门详解(概述、语法、约束、Jsoup解析、Xpath解析)

时间:2022-07-25
本文章向大家介绍JavaWeb——XML入门详解(概述、语法、约束、Jsoup解析、Xpath解析),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、XML概述

XML,Extensible Markup Language可扩展标记语言(也是由w3c(万维网联盟)推出的)。可扩展,标签都是自定义的,如<uesr>、<student>。其主要功能就是存储数据,用于配置文件使用,另外存储的数据可以在网络中传输。

1)xml宇html的区别?

  • xml标签都是自定义的,html标签是预定义的;
  • xml语法严格,html语法松散;
  • xml是存储数据的,html是展示数据;

2)xml的语法

  • xml的后缀名为 .xml
  • xml的第一行必须定义为文档声明
  • xml文档中有且仅有一个根标签
  • 属性值必须用引号(单双均可)引起来
  • 标签必须正确关闭(自闭和或围堵标签)
  • xml标签名称区分大小写

【举例】:xml语法

<?xml version='1.0' ?>

<users> 
	
	<user id='1'>
		<name>zhangsan</name>
		<age>10</age>		
		<gender>male</gender>
	</user>

	<user id='2'>
		<name>lisi</name>
		<age>11</age>		
		<gender>female</gender>
	</user>
	
</users>

3)xml的组成部分

1、文档声明 格式:<?xml 属性列表 ?> 属性列表:version,版本号,必须 属性,当前为1.0                             encoding,编码方式,告知解析引擎当前文档使用的字符集,默认为ISO-8859-1                             standalone,是否独立,值为yes表示不依赖其他文件,值为no表示依赖其他文件。

2、指令(了解):结合CSS的

3、标签:名称自定义的, 规则:

  • 名称可以包含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格

4、属性:id属性值唯一

5、文本:CDATA区:在该区域中 数据会被原样展示<![CDATA[  数据  ]]>

2、XML约束

约束是规定xml文档的书写规则,作为框架的使用者(程序员),需要能够在xml中引入约束文档,且能够简单的读懂约束文档。约束技术的分类:

  • DTD:一种简单的约束技术
  • Schema:一种复杂的约束技术

1)DTD,引入dtd文档到到xml文档中:     内部dtd:将约束规则定义在xml文档中(了解,不常用)     外部dtd:将约束规则定义在外部的dtd文件中            本地:<!DOCTYPE 跟标签名 SYSTEM "dtd文件的位置">            网络:<!DOCTYPE 跟标签名 PUBLIC "dtd文件名字" "dtd文件位置URL">

2)Schema,引入schema文档到xml:     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" 

     <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解析

解析,指的是操作xml文档,将文档中的数据读取到内存中,操作xml文档操作方式有两种:

  • 解析(读取):将文档中的数据读取到内存中;
  • 写入:将内存中的数据保存到xml文档中,持久化的存储。

1)解析xml的方式

1、DOM:将标记语言文档一次性加载至内存,在内存中形成一颗dom树               优点:操作方便,可以对文档进行CRUD的所有操作,一般用于服务器               缺点:占内存

2、SAX:逐行读取,基于事件驱动               优点:不占内存,适用于内存较小的设备,如手机               缺点:只能读取,不能增删改。

2)常见的解析器

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

3)Jsoup解析器

1、Jsoup是免费的第三方开源解析器,快速入门步骤:

  • 导入jar包;
  • 获取Document对象:
  • 获取对应的标签,Element对象;
  • 获取数据。

【举例】:Jsoup解析器读取sudent.xml文档内容

public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        //获取document对象,根据xml文档
        //获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //解析xml文档,加载文档进内存,获取dom树;
        Document document = Jsoup.parse(new File(path), "utf-8");
        //获取元素对象Element
        Elements elements = document.getElementsByTag("name");
        System.out.println("个数:"+elements.size());
        Element element = elements.get(0);
        String name = element.text();
        System.out.println("name:"+name);
    }
}

2、对象的使用

  • Jsoup:是一个工具类,可以解析html或xml文档,返回Docment对象;        *parse:解析html或xml文档,返回Document;                   parse​(File in, String charsetName),解析html或xml文件的                   parse​(String html),解析html或xml字符串的,参数html实际就是文档的内容;                   parse​(URL url, int timeoutMillis),通过网络路径获取指定的html或xml的文档对象;
        URL url = new URL("https://baike.baidu.com/item/jsoup/9012509?fr=aladdin");
        Document document = Jsoup.parse(url, 20000);
        System.out.println(document);
  • Document:文档对象,代表内存中的dom树;        *获取Element对象                  getElementByITag(String tagName),根据标签名获取元素对象集合                  getElementByAttribute(String key),根据属性名称获取元素对象集合                  getElementsByAttributeValue​(String key,String value),根据对应的属性名和属性值获取元素对象集合                  getElementById​(String id),根据id属性值获取唯一的Element对象
  • Elements:元素Element对象的集合,可以当作ArrayList<Element>使用;
  • Element:元素对象          *获取子元素对象                  getElementByITag(String tagName),根据标签名获取元素对象集合                  getElementByAttribute(String key),根据属性名称获取元素对象集合                  getElementsByAttributeValue​(String key,String value),根据对应的属性名和属性值获取元素对象集合                  getElementById​(String id),根据id属性值获取唯一的Element对象           *获取属性值                   attr(String key),根据属性名称获取属性值           *获取文本内容                   text(),获取所有子标签的纯文本内容                   html(),获取便签体的所有内容(包括子标签的标签和文本内容)
  • Node:节点对象,是Document和Element的父类

3、Jsoup快捷查询方式

  • selector选择器   使用方法:Elements    select​(String query),语法参考Selector类中定义的语法
public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        //获取document对象,根据xml文档
        //获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        //查询name标签
        Elements elements = document.select("name");
        System.out.println(elements);
        //查询id值为001
        Elements element = document.select("001");
        System.out.println(element);
        //获取student标签,且number属性值为s001的age子标签
        Elements elements1 = document.select("student[number='s001'] > age");
        System.out.println(elements1);

    }
}
  • Xpath:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。       注意:使用Jsoup的Xpath需要额外导入jar包,查询w3cschool参考手册,使用Xpath语法完成查询。
public class JsoupDemo1 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        //获取document对象,根据xml文档
        //获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        //创建JXDocument对象
        JXDocument jxDocument = new JXDocument(document);
        //结合Xpath语法查询
        //查询所有student便签
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }
        //查询所有student便签下name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }
        //查询student标签下带id属性的name标签
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
        //查询student标签下带id属性的name标签,且id属性值为001
        List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='001']");
        for (JXNode jxNode : jxNodes4) {
            System.out.println(jxNode);
        }
    }
}