简单了解XML

1 篇文章 0 订阅

XML简介:

xml概念:

Extensible Markup Language 可扩展标记语言,标签可扩展,即标签可自定义;xml可解决properties配置文件中属性重复导致不能确的问题,而xml可以解决这个问题,因为xml类型html具有结构化;xml在java中常用于存储配置信息;可在网络中传输。

html语法比较松散,而xml语法严格

html标签是预定义的,而xml标签是自定义的

html是做展示数据用,而xml标签是存储数据用

基本语法:

1.xml文件以xml后缀结尾。

2.xml文件第一行必须定义文声明。

3.xml文档中,有且必须有一个根标签。

4.xm文档中,属性必须使用引号引起来,单双都可以。

5.xml文档中,标签必须正确关闭。

6.xml文档中,标签名区分大小写。

XML组成部分:

1.文档声明:<?xml version='1.0' ?> 其属性有(version版本号,必须属性、encoding编码格式,告诉解析引擎使用的字符集、standalone是否独立,当xml文件依赖其他文件时可以设置为yes)

2.指令:可以引入css等文件

3.标签:不能以数字开头、但是可以包含数字,不能以xml字符开始、不能以标点符号开始、名称不能包含空格

4.属性: id属性值唯一

5.文本:CDATA区,在该区域中的数据会被原样展示,当文本中有特殊字符时,此时需要用到转义字符,如果不想使用转义字符,那么可以将代码放到CDATA区。

<?xml version='1.0' ?>
<!-- 2.文档申明:必须在文档的第一行,注释后面也不行,否则会报错,问号和尖括号之间不能有空格,否则会报错 -->
<!-- 引入一个css样式: css文件中正常写css代码即可,如选中name标签可用:name{ color: 'red'}-->
<?xml-stylesheet type='text/css' href='a.css' ?>
<!-- 3.一个根标签,被自定义为了users -->
<users>
  <!-- 4.属性必须使用引号引起来 -->
  <user id='1'>
    <name>苦海123</name>
    <age>18</age>
    <gender></gender>
  </user>
  <user id='2'>
    <name>苦海</name>
    <age>25</age>
    <gender></gender>
  </user>
  <code>
  if (a > b) {}
  <!-- CDATA区 -->
  <![CDATA[
   if (a > b) {}
  ]]>
  </code>
</users>
XML由谁来编写,由谁来解析使用?

xml文件是由用户编写,供软件解析使用的,不过一般是不写xml文件的,一般能看懂就行。

约束文档:

XML文档的编写是有要求的,市面上常用的约束文档可分为大概如下几类:

1.DTD:一种简单的约束技术,示例如下:

// dtd约束文件student.dtd中代码示例:
<!ELEMENT students (student+) >  // ELEMENT表示定义标签students(students下可以出现一个或多个student标签,加号这里实际是正则匹配,表示一次或多次),
<!ELEMENT student (name,age,sex)> // student标签下可以按顺序出现name,age,sex标签
<!ELEMENT name (#PCDATA)> // #PCDATA表示字符串
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED> // 给student标签定义属性ID(number类型,且#REQUIRED必传)

// 需要编写的xml示例代码和步骤如下:
<?xml version="1.0" encoding="UTF-8" ?>
// 1.引入dtd文档:有两种方式:一、直接将dtd文档定义在xml文档中;二、将外部的dtd文档引入xml文档中。
<!DOCTYPE students SYSTEM "student.dtd"> // dtd文档路径可以是本地或网络地址,<!DOCTYPE students SYSTEM "student.dtd">表示xml根标签为students,SYSTEM为本地路径固定写法,"student.dtd"表示本地dtd约束文档路径、网络地址只需要将SYSTEM变为PUBLIC后,空格跟: "自定义一个dtd文件名" "dtd文件位置URL" ,如:<!DOCTYPE students PUBLIC "demo.dtd" "https:www.demo.com/test.dtd">

// 直接定义在xml文档中的方式:
<!DOCTYPE students [
        粘贴student.dtd文档中的示例代码即可,不推荐此方式引入dtd约束文件,因为太臃肿了
    ]>

<students>
	<student number="s001">
		<name>zhangsan</name>
		<age>abc</age>
		<sex>hehe</sex>
	</student>
	<student number="s002">
		<name>lisi</name>
		<age>24</age>
		<sex>female</sex>
	</student>
</students>

2.Schema:一种复杂的约束技术,弥补了dtd约束文档的缺陷(dtd文档标签中的内容无法约束),示例如下:

// student.xsd示例代码:
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified">
    <xsd:element name="students" type="studentsType"/> // 定义了一个students标签,元素类型是自定义的studentsType类型
    <xsd:complexType name="studentsType"> // 自定义元素类型studentsType:sequence表示按顺序出现student标签,元素的最少出现0次,最多不确定
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/> // 字符串类型
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/> // 必传属性number,类型为自定义numberType
    </xsd:complexType>
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="numberType"> // 自定义numberType约束
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="kuhai_\d{4}"/> // pattern表示组成格式:kuhai_数字
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

//对应的xml代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 
	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">
	<student number="kuhai_0001">
		<name>tom</name>
		<age>18</age>
		<sex>male</sex>
	</student>
</students>
解析xml:

操作xm文档,将文档中的数据读取到内存中,或将内存中的数据写入xml文档。

xml的解析方式:

1.DOM:将标记语言文档一次性加载,在内存中会行程一个dom树。操作dom的优点:操作方便,可以对文档进行CRUD操作,缺点:dom设计不合理的话会非常占内存(常用语pc端)。

2.SAX: 逐行读取,读一行释放一行,基于事件驱动,优点:不怎么占内存(移动端多用SAX),缺点:只能读取,不能增删改。

xml解析器:

1.JAXP: sun公司提供的解析器,支持dom和sax两种思想,比较耗性能。

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

3.jsoup: 是一款java的html解析器,可直接解析url地址,html文档内容,他提供了一套非常省力的api,可以通过dom,css以及类似于jQuery的操作方法来取出和操作数据,这里主要介绍这一款。

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

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 JsoupTest {
    // 1.在项目根目录下新建一个文件夹libs,并将jsoup-1.16.1.jar包导入到libs目录下,并将其添加为库文件...(jsoup下载可到官方网址进行下载:https://jsoup.org/download, jsoup常用于爬虫):
    public static void main(String[] args) throws IOException {
        // 2.获取Document对象,根据xml文档获取(手写一个简单的xml文件,这里我使用了之前的students.xml文档):Jsoup下面有一个方法parse方法,此方法接收一个文件对象(除文件对象外还支持xml或html的字符串或url,当url链接时,第二个参数为超时毫秒值)和字符集编码:
        // 2-1.获取student.xml路径:
        String path = JsoupTest.class.getClassLoader().getResource("student.xml").getPath();
        // 2-2.解析xml文档,加载文档进内存,获取dom树:Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        System.out.println(document); // 以字符串的形式返回xml文档内容:
        // 3.获取元素对象Element:getElementsByTag用来获取标签名为name的元素,这里和JavaScript操作document中node节点一样,方法也基本都一样。
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements); // 获取到了两个name标签的内容
        Element element = elements.get(0);
        System.out.println(element);
        String name = element.text();
        System.out.println(name); // 张 三
    };
    // Jsoup:一个工具类,可以解析html或xml文档,返回Document
    // Document:文档对象,代表内存中的dom树
    // Elements:元素Element对象的集合,可以当做ArrayList<Element>来使用
    // Element: 元素对象
    // Node: 节点对象
}

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者 删除。
笔者:苦海123
其它问题可通过以下方式联系本人咨询:
QQ:810665436
微信:ConstancyMan

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苦海123

快乐每一天!

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

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

打赏作者

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

抵扣说明:

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

余额充值