XML可扩展标记语言基础知识笔记

一、概述

1、概念

XML(Extensible Markup Language)即可扩展文本标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

2、作用

  • 用来保存数据,而且这些数据具有自我描述性
  • 它还可以作为项目或者模块的配置文件
  • 可以作为网络传输数据的格式(JSON格式为主)

3、注释

XML和HTML一样,使用:< !- - html注释 - - >

二、语法

1、元素(标签)

概念

xml元素是指从(且包括)开始标签到(且包括)结束标签的部分。

命名规则

  1. 标签名称可以含字母、数字以及其他的字符(中文)
  2. 名称不能以数字或者标点符号开始
  3. 名称不能以字符“xml”(或者XML、Xml)开始【可以识别】
  4. 名称不能包含空格

注意

xml中的元素(标签)既支持单标签,也支持双标签。
如< book >或< books ></ books>

	1.单标签
		* 格式:<标签名 属性=“值” 属性=“值”...... />
	2.双标签
		*格式:<标签名 属性=“值” 属性=“值”...... />文本数据或子标签</标签名>

2、语法规则(重点)

  1. xml文档的文件后缀为 .xml 格式
  2. xml第一行必须定义为文档声明
  3. xml文档有且仅有一对根标签(顶级标签)
  4. 所有xml元素必须有关闭标签(闭合,成一对)
  5. xml元素(标签)必须正确嵌套(和HTML一样)
  6. 属性值必须使用引号引起来
  7. xml中的特殊符号要用转义字符
  8. xml标签名区分大小写

特殊字符的实体引用:

在这里插入图片描述

示例:

<?xml verson="1.0" encoding="utf-8"?>
<!--以上为xml文件的头部声明-->

<books><!--books表示多个图书信息-->
    <book sn="SN001"><!--book表示一个图书信息,SN表示图书序列号-->
        <name>时间简史</name><!--图书名-->
        <author>霍金</author><!--作者-->
        <price>100</price><!--价格-->
    </book>
</books>

头部声明的属性值有:

  • version:版本号,必须的属性
  • encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1。
  • standalone:是否独立。取值:yes:不依赖其他文件。no:依赖其他文件。

3、文本区域(CDATA区)

CDATA语法可以告诉xml解析器:在CDATA里的文本内容,只是纯文本,不需要xml语法解析。

CDATA格式:
< ! [ CDATA [ 这里可以把你输入的字符原样显示,不会解析xml ] ]>

4、xml与html的区别

  1. XML标签都是自定义的,HTML标签是预定义。
  2. XML的语法严格,HTML语法松散。
  3. XML不是用来替换html的技术,它和HTML是分别为不同的目的而设计的。
  4. XML是包含和传输数据;HTML是显示数据。

三、XML验证

1、DTD(Document Type Definition)【过时】

作用: DTD定义了XML文件的结构;为XML文件提供语法与规则;保证了数据的正确交换。

定义区域: 1,在XML文件中;2,在XML文件外。

实体: 是用于定义引用普通文本或特殊字符的快捷方式的变量,实体引用是对实体的引用,可在内部或外部声明。

DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:

<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>

2、Schema(XML Schema Definition(XSD))

定义: 描述XML文档的结构,是基于XML的DTD的替代者

作用: 1,可保护数据通信;2,是可扩展的(由XML编写)。

<xs:element name="note">

<xs:complexType>
  <xs:sequence>
    <xs:element name="to"      type="xs:string"/>
    <xs:element name="from"    type="xs:string"/>
    <xs:element name="heading" type="xs:string"/>
    <xs:element name="body"    type="xs:string"/>
  </xs:sequence>
</xs:complexType>

</xs:element> 

3、Schema与DTD的异同:

相同: Schema是DTD的继任者,它会在将来取代DTD。

不同: Schema可针对未来的需求进行扩展;基于XML编写;支持数据类型;功能更强大和完善。

四、XML解析(Schema规则)

1、引入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”
<users   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  			xmlns="http://www.itcast.cn/xml"
  			xsi:schemaLocation="http://www.itcast.cn/xml  user.xsd">

2、解析介绍

方式

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

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

解析xml的方式:

1.DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
	*	优点:操作方便,可以对文档进行CRUD的所有操作
	*	缺点:占内存
2.SAX:逐行读取,基于事件驱动的。
	*	优点:不占内存。
	*	缺点:只能读取,不能增删改

XML常见的解析器:

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

3、解析操作

步骤:

  1. 导入jar包
  2. 获取Document对象
  3. 获取对应的标签Element对象
  4. 获取数据
	  //1.获取student.xml的path
      String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
      //2.解析xml文档,加载文档进内存,获取dom树--->Document
      Document document = Jsoup.parse(new File(path), "utf-8");
      //3.获取元素对象 Element
      Elements elements = document.getElementsByTag("name");

      System.out.println(elements.size());
      //3.1获取第一个name的Element对象
      Element element = elements.get(0);
      //3.2获取数据
      String name = element.text();
      System.out.println(name);

对象的使用:

1. Jsoup:工具类,可以解析html或xml文档,返回Document
* parse:解析html或xml文档,返回Document
	* parse​(File in, String charsetName):解析xml或html文件的。
	* parse​(String html):解析xml或html字符串
	* parse​(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
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. 获取子元素对象
	* getElementById​(String id):根据id属性值获取唯一的element对象
	* getElementsByTag​(String tagName):根据标签名称获取元素对象集合
	* getElementsByAttribute​(String key):根据属性名称获取元素对象集合
	* getElementsByAttributeValue​(String key, String value):根据对应的属性名和属性值获取元素对象集合

2. 获取属性值
	* String attr(String key):根据属性名称获取属性值
3. 获取文本内容
	* String text():获取文本内容
	* String html():获取标签体的所有内容(包括字标签的字符串内容)
5. Node:节点对象
* 是Document和Element的父类

快捷查询方式:

1. selector:选择器
* 使用的方法:Elements select​(String cssQuery)
* 语法:参考Selector类中定义的语法

2. XPath: XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言

  • 使用Jsoup的Xpath需要额外导入jar包。
  • 查询w3cshool参考手册,使用xpath的语法完成查询
	   //1.获取student.xml的path
       String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
       //2.获取Document对象
       Document document = Jsoup.parse(new File(path), "utf-8");

       //3.根据document对象,创建JXDocument对象
       JXDocument jxDocument = new JXDocument(document);

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

       System.out.println("--------------------");

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

       System.out.println("--------------------");

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

  List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
       for (JXNode jxNode : jxNodes4) {
           System.out.println(jxNode);
       }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值