XML

概念

  • Extensible Markup Language:可扩展标记语言
    可扩展:标签不是定义好的,而是自定义的。

  • 功能:存储数据,用于作配置文件或在网络中传输

  • XML与HTML的区别:
    (1)xml标签都是自定义的,html标签是预定义的
    (2)xml的语法严格,html的语法松散
    (3)xml是存储数据的,html是展示数据的

语法:

(1)基本语法:

  • xml文档后缀名为.xml
  • xml文档第一行必须定义文档声明(必须在第一行,前面有一个空格都不行)
  • xml文档中有且仅有一个根标签
  • 属性值必须使用引号括起来(单双都可以)
  • 标签必须有关闭,要么是有一个闭合标签,要么是自闭标签
  • 标签名称区分大小写

(2)快速入门:


(3)组成部分:

  • 文档声明
    (1)格式:<?xml 属性列表 ?>
    (2)属性列表:
    【1】version:版本号,必须的属性,一般写1.0即可
    【2】encoding:编码方式,告知解析引擎当前文档使用的字符集,默认iso-8859-1
    【3】standalone(了解以下即可,不重要):是否独立,yes或者no
  • 指令(了解即可,不重要):可用来导入css文件
  • 标签:标签名称定义有一些规则,可在官网查看
  • 属性:id属性值唯一
  • 文本内容:CDATA区,在该区域中的数据会被原样展示,不需要写转义字符,格式为:
<![CDATA[
  if(a < b && a > c){}
]]>

(4)约束:规定xml文档的书写规则

  • 对于约束的掌握要求是(重点,其他都不用管,会这两点就够了):
    【1】能够在xml中引入约束文档
    【2】能够简单地读懂约束文档

  • 约束分类:
    (1)DTD:一种简单的约束技术
    (2)Schema:一种复杂的约束技术

  • DTD:
    (1)引入dtd文档(内部dtd):将约束规则定义在xml文档中,内部dtd不必引入
    (2)引入dtd文档(外部dtd):将约束规则定义在外部dtd文件中 ,引入分为两种
    【1】本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的路径">
    【2】网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的URL">

  • SCHEMA:
    (1)填写xml的根标签
    (2)引入xsi前缀,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    (3)引入xsd文件命名空间,xsi:schemaLocation="http://xxx/xxx/xx a.xsd"
    (4)为每一个xsd约束声明一个前缀,作为标识:xmlns:标识符="http://xxx/xxx/xx"(值和命名空间一样)
    引入命名空间后,所有标签前面都要加入命名空间,否则报错。但是这样写太麻烦,所以给命名空间起前缀标识符,在标签前面加入标识符即可,如:

xmlns:a = "http://xxx/xxx/xx"
<a:users>
</a:users>

如果xmlns后面什么都不写,默认就是空前缀
小例子:

<?xml version='1.0'?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
       http://www.itcast.cn/xml student.xsd
       http://www.baidu.com/xml user.xsd
    "

       xmlns:a="http://www.itcast.cn/xml"
       xmlns:b="http://www.baidu.com/xml"
>
    <user>
        <a:name>张三</a:name>
        <a:age>21</a:age>
        <b:gender>男</b:gender>
    </user>
</users>

解析

操作XML文档:

  • 1.解析(读取)
  • 2.写入(保存)

解析XML文档的方式

  • 1.DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树
    优点:操作方便,可以对文档进行CRUD操作
    缺点:占内存

  • 2.SAX:逐行读取,基于事件驱动
    优点:不占内存
    缺点:只能读取,不能增删改

XML常见的解析器

  • 1.JAXP:sun公司提供的解析器,支持DOM和SAX (这种写起来比较麻烦,了解即可)
  • 2.DOM4J:一款非常优秀的解析器,支持DOM
  • 3.Jsoup:一款好用的HTML解析器,也可以用来解析XML,支持DOM
  • 4.PULL:安卓系统内置解析器,支持SAX

Jsoup解析器:

  • 快速入门
    1.导入jar包
    2.获取Document对象
    3.获取对应的标签Element对象
    4.获取对象的数据
    小例子:
public class JsoupDemo1 {
    //Jsoup快速入门
    public static void main(String[] args) throws IOException {
        //1.获取Document对象
        //根据xml文档获取document对象
        File file = new File(JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath());
        Document document = Jsoup.parse(file, "utf-8");
        //2.获取元素对象
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.get(0));
    }
}
image.png

涉及到的类和方法:

  • 1.Jsoup.parse(File file,String charsetName):解析Html或Xml文档,返回Document对象
  • 1.1 Jsoup.parse(String html):解析html或xml字符串
  • 1.2 Jsoup.parse(String url,Long timeoutMillis):在超时时间内解析URL
  • 2.Document:文档对象,代表内存中的Document树
    主要用于获取Element对象,方法为继承自Element的getElementBy系列方法
  • 3.Elements:元素Element对象的集合,可以当作ArrayList<Element>
  • 4.Element:元素对象
  • 5.Node:节点对象
    Document对象常用方法:
package 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 JsoupDemo2 {
    public static void main(String[] args)throws IOException {
        Document document = Jsoup.parse(new File(JsoupDemo2.class.getClassLoader().getResource("student.xml").getPath()), "utf-8");
        //1.获取所有student对象
        Elements elements = document.getElementsByTag("student");
        System.out.println(elements);
        System.out.println("============");

        //2.获取所有设置了id属性的元素
        Elements elements1 = document.getElementsByAttribute("id");
        System.out.println(elements1);
        System.out.println("============");

        //3.获取number属性为002的元素
        Elements elements2 = document.getElementsByAttributeValue("number", "002");
        System.out.println(elements2);
        System.out.println("============");

        //4.获取id值为1的元素
        Element element = document.getElementById("1");
        System.out.println(element);
    }
}

Element对象:
1.对于Document的一系列getElementBy方法,Element对象都能使用,但是其效果不是获取所有元素,而是获取其子元素
2.获取属性值:String attr(String key):根据属性名称获取属性值
3.获取文本:
String text():获取文本
String html():获取Html

根据选择器查询

我们可以看出,Jsoup通过Node对象提供的方法去获取DOM元素的话,其实和JS中的DOM操作是一样的,这样在精确获取某些元素时,会显得不太方便。
因此,需要使用其他更为灵活的方式来获取元素。
(1)selector:选择器
使用的方法:Element类中的Elements select(String cssQuery):选择器和JQ的基本一样
选择器参考Selector类。
小例子:

public class JsoupDemo4 {
    public static void main(String[] args)throws IOException {
        Document document = Jsoup.parse(new File(JsoupDemo4.class.getClassLoader().getResource("student.xml").getPath()), "utf-8");
        Elements elements = document.select("name");
        System.out.println(elements);
        System.out.println("=============================");

        Elements elements1 = document.select("#1");
        System.out.println(elements1);
        System.out.println("=============================");

        //获取number属性值为001的student标签下的age标签
        Elements elements2 = document.select("student[number='001'] > age");
        System.out.println(elements2);
    }
}

(2)XPath

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

Xpath其实和Jsoup的关系不是特别大,只要有DOM树,都可以使用Xpath来进行获取元素,比如DOM4J、JAXP等。

使用步骤:
1、导入xpath的jar包
xpath有专门结合jsoup来生成DOM树的jar包,即JsoupXpath.jar

2、根据Jsoup的Document对象,来创建支持Xpath语法的JXDocument对象

3、结合Xpath语法进行查询

小例子:

public class XpathDemo1 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        Document document = Jsoup.parse(new File(XpathDemo1.class.getClassLoader().getResource("student.xml").getPath()), "utf-8");
        //参加Xpath DOM树
        JXDocument jxDocument = new JXDocument(document);

        //根据语法查询元素
        //1.查询所有student标签
        List<JXNode> jxNodes = jxDocument.selN("//student");
        System.out.println(jxNodes);
        //2.查询所有student标签下的name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
        System.out.println(jxNodes2);
        //3.选取所有student标签虚啊带有id属性的name标签
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
        System.out.println(jxNodes3);
        //4.选取所有student标签虚啊带有id属性,并且id属性为1的name标签
        List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='1']");
        System.out.println(jxNodes4);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。