学习笔记|XML与JSON

本文最后更新于:1 个月前

1.XML

可扩展标记语言(Extensible Markup Language)。

1
2
3
4
5
6
7
<?xml version="1.0"?>
<中国>
<bei>
<chao></chao>
<hai></hai>
</bei>
</中国>

2.常见应用

  • 用于 client / Server 之间的数据传输。使用 XML 格式描述,具有可读性和可维护性。
  • 保存有关系的数据。
  • 作为软件的配置文件。如 Java EE 中 struts、spring 的配置文件;Android 中布局文件、menifest文件、清单文件。

3.文档声明

1
<?xml version="1.0" encoding="UTF-8" standlone="yes"?>
  • encoding:说明文档所使用的字符编码。默认为 UTF-8。
  • standlone:说明文档是否独立,是否依赖其他文档。

4.XML 元素

  • 开始标签、闭合标签

    • 包含标签主体:<china>民主和谐</china>
    • 不包含标签主体:<china/>
  • 一个 XML 文件中只能有一个根标签。

5.规范

  • 用于传输的 XML 文件没有空格、回车,目的节省传输流量。

  • XML 元素可包含字母、数字及其他一些可见字符。

    • 区分大小写。

    • 不能数字和下划线开头。

    • 不能以 xml、Xml、XML 开头。

    • 不能包含空格。

    • 标签中不能出现冒号。

6.属性

  • 一个元素有多个属性,每个属性有自己的 key value。

  • 属性值用单引号或双引号引起来。

  • 属性命名规范与元素命名规范一致。

  • 元素的属性不能重复。

1
2
3
4
<?xml version="1.0"?>
<class_1>
<student name="xiaoming"/>
</class_1>
1
2
3
4
5
6
<?xml version="1.0"?>
<class_1>
<student>
<name>xiaoming</name>
</student>
</class_1>

7.注释

1
<!--注释-->

快捷键:ctrl + /

8.CDATA

CDATA section 中的文本不会被解析器解析。

1
<![CDATA[<此处不会被解析器解析>]]>

9.特殊字符

以下特殊字符,若需在元素主体中显示,需进行转义。

特殊字符替代字符
&&amp
<&lt
>&gt
&quot
&apos
1
<data>small&lt;big<data>

显示为:<data>small<big<data>

10.约束

  • XML 文档是用户自定义的标签,为了保障软件程正确地获取内容。
  • 需要编写 XML 约束文档来约束 XML 文档的书写规范。

约束文档

  • XML 中允许出现的元素名称、属性、元素出现顺序。
  • 常见的约束技术有:DTD、Schema。

11.DTD

11.1 引用 DTD 文档

DTD(Document Type Definition)文档类型定义。

作用:约束 XML 文件的书写规范。

PS:DTD 可以也写在单独的文件中,扩展名是 dtd,且必须使用 UTF-8 编码(XML文档内部编写 DTD,没有编码要求)。

(1)外部 DTD 在本地时

引用格式如下:

1
2
3
<!DOCTYPE 根元素名 SYSTEM "本地 DTD 的路径">
<!--实例如下-->
<!DOCTYPE 书架 SYSTEM "book.dtd">

(2)外部 DTD 在公共网络上

引用格式如下:

1
2
3
<!DOCTYPE 根元素名 PUBLIC "DTD 名" "外部 DTD 的 url">
<!--实例如下-->
<!DOCTYPE web-app PUBLIC "my_dtd" "https://java.sun.com/dtd/web-app_2_3.dtd">

(3)XML 文档内部编写 DTD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<!ATTLIST 书
ISBN ID #REQUIRED
COMMENT (a|b) #IMPLIED
出版社 CDATA "南方出版社"
>
<!ENTITY copyright "程序员">
]>
<书架>
< ISBN="a" COMMENT="b" 出版社="" >
<书名>精通CPP</书名>
<作者>&copyright;</作者>
<售价>39.00元</售价>
</>
< ISBN="b">
<书名>干翻golang</书名>
<作者>科比</作者>
<售价>28.00元</售价>
</>
</书架>

11.2 定义元素

看懂即可。

语法:<!ENTITY 元素名称 使用规则>

使用规则:

  • (#PCDATA):元素标签内的主体内容只能是普通文本。
    • PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
    • 被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
1
<!ELEMENT 书名 (#PCDATA)>
  • EMPTY:元素标签内的主体只能是空文本。
1
2
3
4
5
6
7
<!ELEMENT element-name EMPTY>

实例:
<!ELEMENT br EMPTY>

XML example:
<br />
  • ANY:元素标签内的主体为任意内容。

11.3 定义子元素及描述关系

  • 逗号分隔子元素

这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。

1
2
3
4
5
6
7
8
9
10
11
12
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

实例:

<书 ISBN="a" COMMENT="b" 出版社="" >
<书名>精通CPP</书名>
<作者>&copyright;</作者>
<售价>39.00元</售价>
</书>
  • |分隔子元素

多个元素中,任选其一。

1
<!ELEMENT note (to,from,header,(message|body))>

上面的例子声明了:”note” 元素必须包含 “to” 元素、”from” 元素、”header” 元素,以及 “message” 元素或 “body” 元素。

  • 用 + * ? 来表示元素出现次数
    • + 表示至少出现一次。
    • * 表示可有可无。
    • ? 表示 0 次或 1 次。
    • 无 + * ? 表示必须出现一次

11.4 定义属性

语法:<!ATTLIST 元素名称 属性名称 属性值类型 设置说明>

属性值类型:

  • CDATA:属性的取值为普通的文本字符串
  • (a|b|c):取值其中任选其一。
  • ID:属性取值不能重复。

设置说明:

  • #REQUIRED:该属性必须出现。
  • #IMPLIED:该属性可有可无。
  • #FIXED:该属性的取值为固定值。
1
2
3
4
5
<!ATTLIST 书
ISBN ID #REQUIRED
COMMENT (a|b) #IMPLIED
出版社 CDATA "南方出版社"
>

11.5 定义引用实体

语法:<!ENTITY 实体名称 实体内容>

1
2
3
4
5
<!ENTITY copyright "程序员">

<!-- 实例(在 XML 中 引用实体)-->

<作者>&copyright;</作者>

12.Schema

  • Schema 本身就是 XML 文档。扩展名:.xsd。

  • 支持 namespace,一个 namespace 对应一个约束文档。

  • 缺点:不能想 DTD 定义实体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.aimtao.com"
elementFormDefault="qualified">
<xs:element name='书架'>
<xs:complexType>
<xs:sequence maxOccurs='unbounded '>
<xs:element name='书 '>
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type='xs:string' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

13.XML 解析

DOM 解析和 SAX 解析,jdk 都提供解析的接口。

  1. DOM 解析

在内存中构建一个树形结构。

优点:将整个 XML 文件在内存中构建树状结构,增删改操作便利。

缺点:如果解析的文件过大,一次性在内存中分配一个树状结构,会内存溢出。

解析思路:DocumentFactory –> DocumentBuilder –> Document –> 通过节点获取 NodeList->具体的 Node。

  1. SAX 解析

边读边解析。读到不同的标签,进行不同的处理。

优点:不会造成内存溢出。

缺点:不能修改 xml 文件。

SAXParserFactory –> SAXParser –> SAXReader –> 不同的 Handler

  1. pull 解析

需要导入 jar 包。

14.json

JavaScript 对象表示法。一种简单的数据格式,比 XML 更轻巧。

14.1 规则

  • 名称:值。class:2

  • 并列数据使用 , 表示。class:2,grade:1

  • 一个集合使用 {} 表示。{class:2,grade:1}

  • 数据集合数组用 [] 表示。

1
2
3
4
[
{class:2,grade:1},
{class:2,grade:1}
]
  • 元素类型:string、number、object、array、true、false、null

14.2解析

jar 包:org.json.JSONObject


本博客所有文章均个人原创,除特别声明外均采用 CC BY-SA 4.0协议,转载请注明出处!