如何能正确理解 XML,以及SAX,DOM解析运用

前言

简单的来说 : XML 是一种文件格式后缀,就好像是windows系统文件上的 txt 一样,但是他们又不完全一样。

XML简介

XML技术是W3C组织发布的,目前遵循的是W3C组织于2000发布的XML1.0规范。
(有的同学会怀疑为什么20年以来,XML还是使用的 XML1.0规范呢?在这之前其实有过XML1.1版本,但是1.1版本出现了不可兼容1.0版本的情况,并且1.0使用效果还可以,所以人们就继续使用1.0版本)

XML是什么?

  1. XML 是一种可扩展标记语言
    (正如它的英文名字一样 EXtensible (可扩展)Markup(标记) Language)

  2. XML 是传输数据,而非显示数据。
    (它是将你在.xml文件中写的内容传输到网页上,所以他是传输数据,非显示数
    据,具体解释我们下面进行操作的时候,你就会明白)

  3. XML 文件和windows记事本一样打开的界面是空白的,需要自行定义标签。
    (标签:一个标签可以分为开始标签和结束标签,在开始标签和结束标签之间又可以嵌套其它标签,利用标签间的嵌套关系来保存数据之间的上下级关系)

XML的作用(为什么要用它?)

1.处理文档信息的得力工具

. XML被设计用来描述、存储、传送及交换数据。XML是当前处理结构化文档信息的有力工具,标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。简单说,XML就是一种数据的描述语言,你可以把它理解为微型数据库,对了!它就是数据库。

2.XML让你的数据随时随处可使用

. 在过去的时候,每个软件都有自己独有的存储方式,很难被第三方软件识别和读取,而XML这种自说明(自我描述性)结构更容易兼容,并且它是以一种纯文本格式存储,这样就可以在不同的软件*享数据(xml纯文本存储提供了一种独立于软件和硬件的存储方法)

3. XML将延续你的关系

. 现实生活中存在着大量的数据,在这些数据之间往往存在一定的关系,我们希望能在计算机中保存和处理这些数据的同时能够保存和处理他们之间的关系。

实际案例说明:

1.软件之间的共享
在过去的时候,每个软件都有自己独有存储的方式,(这就好比如你是汉语软件,他是英语软件,我的是硬件数据,这样我们的软件共享就很难进行,这时出现了一个翻译器xml描述,那我们就可以将我们的软件数据交给xml去为我们描述,这样就很容易的进行数据共享)这个比喻只是为了更好的让你理解,具体的理解还需要你自己去参悟。

2.不兼容系统之间传输数据
通过 XML,可以在不兼容的系统之间轻松地交换数据。
在开发过程中,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。以 XML 交换数据可以更简单的进行数据交换。

3.平台系统的升级
在平台系统的升级中,会有大量数据的转化,如果你旧系统的数据和新系统的数据没有兼容性的话,会导致大量数据的丢失,这样就会到时新系统出现一定的问题。XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。

4.XML 使您的数据更有用
由于 XML 独立于硬件、软件以及应用程序,XML 会使您的数据更可用,也更有用。
不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。(这种感觉就好像你使用微信账号登录其软件一样,不用再进行重新注册,他会直接访问到你微的信息,从而达到一个让您的数据更加有用)

XML怎么用?

1.XML文档声明
. 文档声明就好像为你规定了写盖房子的框架。
. 通常来说一个XML必须包含且只包含一个文档声明
. 文档声明必须处在XML的第一行,前面不能有其他内容
. 如果一个XML不包含文档声明则称这样的XML为格式不良好的XML
. 在许多时候即使不包含文档声明,XML也可以被正常使用,但是这是不符合标准.的,存在风险,因此强烈推荐大家在书写XML时写上文档声明。

     <?xml version="1.0"  encoding="GB2312"  standalone="yes" ?>
   
        version 代表当前xml所遵循的xml标准
        (version表明当前xml遵循的xml规范,目前为止,就是7.4)
        在第二个问号之前应该有一个空格
        注意:问号、引号、空格都必须为英文半角
        实验:编写一个带有文档声明的XML
        
       encoding 告知解析器使用何种编码解析当前xml文档
       encoding默认值为ISO8859-1
       实验: encoding指定编码与xml文件保存编码不同导致的乱码问题。
       解决方案:编码解码码表一致原则
    
       standalone表示当前xml文档是否是一个独立文档,
       当为yes时表示是一个独立文档,
       当为no时表示当前文档需要其他文档支持。

XML标签
◇一个XML文档有且只有一个根标签,我们对xml文档进行解析的时候就是获取他的根标签然后对其中的子标签进行修改,(这个根标签的作用就和一个包包一样,我们将所有的东西存到这个包包中。我们需要的时候包包拿过来,对其中的东西进行拿出来分析)
◇ 一个标签(标记)就是一个元素。
◇ 标签分为开始标签和结束标签, 在开始标签和结束标签之间的文本称之为标签体。

                  <p>  Hello  </p>
                  <p>:开始标签
                  Hello:标签体
                  </p>:结束标签

◇ 如果一个标签既不包含标签体, 也不包含其他的子标签, 可以把开始标签和结束标签合并成一个自闭标签。
◇ 标签要合理的嵌套, 不能出现交叉嵌套。
◇ 元素的命名规范:
区分大小写:

  	 如:<P> 和<p>是两个不同的标签。

不能以数字或标点符号开头。
不能以xml(XML, Xml)开头。
不能包含空格 如:
不能包含冒号 如:<a:b>
易犯错误:
标签没有结束标签或者是自闭标签没有自闭!!!
我们先在记事本中写一个xml文档,
如何能正确理解 XML,以及SAX,DOM解析运用然后我们将后缀 txt 更改为 xml,就完成了一个 xml文档。如何能正确理解 XML,以及SAX,DOM解析运用
然后将其直接拖到浏览器中他就会有这种显示:
如何能正确理解 XML,以及SAX,DOM解析运用

XML属性
一个元素上可以声明多个属性, 多个属性之间用空格隔开。
属性与属性值用等号连接, 属性的值用单引号或者双引号引起来。
属性的命名和元素遵循相同的命名规范。

XML注释 (了解)
格式:
注释不能放在文档声明的前面
注释不能交叉嵌套

XML转义字符 (了解)

	 常用的转义字符:
		<  &lt;
		>  &gt;
		&  &amp;
		"  &quot;
		'  &apos;

xml约束 (了解)
约束: 在xml中, 可以提供约束文档来约束xml文档的写法
DTD/Schema W3C
DTD:简单易学,上手快,但是功能有局限性,不能限制标签体值得类型或者范围
Schema:复杂,难学。但是可以做到精细的限定

标题XML解析

1.两种解析思想 (!!!重要)

	DOM解析:
		将整个XML文档加到内存中,用一个Document对象来表示整个文档。
		将XML文档中所有的内容(元素、属性、文本等)都解析成一个一个的对象,
		用对象来表示元素,用对象与对象之间的引用关系来表示元素之间的层级关系。
		通过在程序中操作对象来间接的操作(增删改查)XML文档中的内容。
		
		优点:
			(1)可以十分方便对节点进行增删改查的操作。
			(2)在内存中保存了一颗文档结构树,
			           只需要解析一次就可以重复使用这些数据。
		缺点:
			(1)将整个文档都加载到内存中用对象表示,占用内存空间,如果xml文档
			         体积非常庞大时,将会十分耗费内存。
			(2)需要等整个xml文档解析完成后,才可以对节点进行操作,
			         相对来说耗费时间,效率低。

	SAX解析:
		优点:
			(1)由于是逐行解析,因此不需要将整个XML文档加载进内存,占用内存小。
			      理论上多大的XML文件都可以解析
			(2)由于是逐行解析,遇到想要的内容就可以停下来处理,效率高
		缺点:
			(1)每次需要数据都需要重新解析。
			(2)只能读数据,不能对XML文档进行增删改的操作。

利用SAX解析xml文档

如何能正确理解 XML,以及SAX,DOM解析运用
我们现在准备做一个利用SAX解析XML文档的程序,这个程序是对.xml文件中的内容进行一些修改。

        程序的第一步就是:SAXReader reader = new SAXReader();

  1. 在程序开始的时候我们先创建一个SAXReader创建一个对象,
    (为什么要用 SAXReader 这个类,因为SAX对于.xml文件解析的优点为:逐行解析,不用全部加载到内存,这样就节约了空间,理论上说多大的xml文件都能解析,另外一点是我们解析到哪里他可以停下里对其操作,效率高。所以我们程序开始的时候进行了SAXReader 类创建了对象 去解析xml文件)

    程序第二部就是:Document document = reader.read(book.xml);
  2. 创建完对象我们就要使用它进行分析xml文件。所以下一步是: reader.read(book.xml);我们解析完它我们需要将解析完的xml文件放到 Document中 (为什么用Document对象?将整个XML文档加到内存中,用一个Document对象来表示整个文档。将XML文档中所有的内容(元素、属性、文本等)都解析成一个一个的对象,用对象来表示元素,用对象与对象之间的引用关系来表示元素之间的层级关系。通过在程序中操作对象来间接的操作(增删改查)XML文档中的内容。)

    程序第三步就是:Element rootEle = document.getRootElement();
  3. 接下来我们就开始进行对其一系列操作。我们使用document获取到根元素,然后将其传到Element, ;(为什么要获取根元素,我们之前已经解释过了,他就好想一个包包,将所有对象存进去。现在我们要对其进行操作,所有我们要先将包包取过来,Element对象在XML中就表示文档中的元素,这样 rootEle表示XML文档中的元素集合)

    程序第四步:Element bookEle = rootEle.element("书")
  4. 我们前一步把根元素赋值给了rootEle,rootEle就可以调用根元素里面的内容,我们现在把 书 的内容提取出来 赋值给 bookELe;

    程序第五步: Element bookNameEle = rootEle.element("书名");
  5. 接下来套路就一样了。比如我们获取书名这个名字,rootEle就可以调用里面的内容,我们现在把 书名 的内容提取出来 赋值给 bookNameELe;

    程序第六步:     String value = bookEle.getText();
  6. 由于XML文档本身就是字符串,所以我们还需要一个字符串来存储输出;

    程序最后一步:System.out.println("书名为:" + value);
  7. 然后将存储的值输出,

结束语

我们还可以对文件进行增删改查,但是操作基本雷同,就不做过多解释了。若有疑问或者对文章有任何想法请留言。会尽快为你解决疑难

上一篇:【Python系列专栏】第四十三篇 Python中常用内建模块(XML)


下一篇:XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?