JavaRush /Java 博客 /Random-ZH /Java 程序员的 XML 基础知识 - 第 1 部分(共 3 部分)
Ярослав
第 40 级
Днепр

Java 程序员的 XML 基础知识 - 第 1 部分(共 3 部分)

已在 Random-ZH 群组中发布
XML 是当今非常流行且灵活的格式。每个程序员都应该理解它,它是必须具备的。如今,许多技术都是相互连接的,他们积极地使用它们,现代技术也在其中。
Java 程序员的 XML 基础知识 - 第 1 部分(共 3 部分) - 1

介绍

你好,我的文章的亲爱的读者。我想说,这只是我的三篇文章系列中的第一篇文章。整个系列的主要目标是引导每位读者了解 XML,并提供(如果不是完整的解释和理解)至少对其进行良好的推动,解释要点和内容。整个周期将针对一项提名——“关注细节”,分为3篇文章,以适应帖子的字数限制,并将大量材料分成较小的部分,以便更好地理解。第一篇文章将专门介绍 XML 本身及其含义,以及为 XML 文件创建模式的方法之一 - DTD。首先,我想为那些还不熟悉 XML 的人做一个小前言:没有必要害怕。XML 并不是很复杂,任何程序员都应该理解,因为它是当今一种非常灵活、高效和流行的文件格式,用于存储您想要的各种信息。XML 用于 Ant、Maven、Spring。任何程序员都需要 XML 知识。现在你已经积聚了力量和动力,让我们开始学习吧。我会尝试尽可能简单地列出所有材料,只收集最重要的内容,而不是杂乱无章。

XML

为了更清楚地解释,最好用一个例子来可视化 XML。
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee>
                    <name>Maksim</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Ivan</name>
                    <job>Junior Software Developer</job>
                </employee>
                <employee>
                    <name>Franklin</name>
                    <job>Junior Software Developer</job>
                </employee>
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee>
                    <name>Herald</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Adam</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Leroy</name>
                    <job>Junior Software Developer</job>
                </employee>
            </employees>
        </office>
    </offices>
</company>
HTML 和 XML 在语法上很相似,因为它们有一个共同的父级 - SGML。然而,在 HTML 中只有特定标准的固定标签,而在 XML 中,您可以创建自己的标签、属性,并且通常可以按照适合您的方式存储数据。事实上,任何懂英语的人都可以阅读 XML 文件。这个例子可以用树来描述。 Java 程序员的 XML 基础知识 - 第 1 部分(共 3 部分)- 2树的根是公司。它也是所有其他元素都来自的根(root)元素。每个 XML 文件只能有一个根元素。它必须在xml 文件(示例中的第一行)声明之后声明,并包含所有其他元素。关于声明的一些信息:它是强制性的,并且需要将文档标识为 XML。它有三个伪属性(特殊的预定义属性):version(按照1.0标准)、encoding(编码)和standalone(自治:如果是并且外部schemes连接到文档,那么就会出现错误,默认没有)。 元素是使用其他元素和属性存储数据的实体。属性是添加元素时指定的有关元素的附加信息。如果我们将解释翻译成OOP字段,我们可以给出以下例子:我们有一辆汽车,每辆车都有特征(颜色、容量、品牌等)——这些是属性,汽车内部有实体:门、窗、发动机、方向盘是其他元素。您可以根据需要将属性存储为单个元素或属性。毕竟,XML 是一种极其灵活的格式,可用于存储任何信息。解释完之后,我们只需要看看上面的例子,一切就都明白了。在示例中,我们描述了一个简单的公司结构:有一家公司,有名称和办公室,办公室里有员工。Employees 和 Offices 元素是包装元素 - 它们用于收集相同类型的元素,本质上是将它们组合成一组以便于处理。地板和房间值得特别注意。这些是办公室的属性(楼层和号码),换句话说,就是它的属性。如果我们有一个“图像”元素,那么我们就可以转移它的尺寸。您可能会注意到,company 没有 name 属性,但有 name 元素。您可以按照您想要的方式简单地描述结构。没有人强迫您只在属性中写入元素的所有属性;您可以只使用元素并在其中写入一些数据。例如,我们可以将员工的姓名和职位记录为属性:
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="Maksim" job="Middle Software Developer">

                </employee>
                <employee name="Ivan" job="Junior Software Developer">

                </employee>
                <employee name="Franklin" job="Junior Software Developer">

                </employee>
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer">

                </employee>
                <employee name="Adam" job="Middle Software Developer">

                </employee>
                <employee name="Leroy" job="Junior Software Developer">

                </employee>
            </employees>
        </office>
    </offices>
</company>
正如你所看到的,现在每个员工的姓名和职位都是他的属性。您可以注意到员工实体(标签)内没有任何内容,所有员工元素都是空的。然后,您可以将员工设置为空元素 - 在声明属性后立即将其关闭。这很简单,只需添加一个斜杠:
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="Maksim" job="Middle Software Developer" />
                <employee name="Ivan" job="Junior Software Developer" />
                <employee name="Franklin" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
正如您所看到的,通过关闭空元素,我们保留了信息的整体完整性,并大大缩短了记录,使信息更加简洁和可读。要在 XML 中添加注释(解析文件时将跳过的文本),语法如下:
<!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
最后一个结构是CDATA,意思是“字符数据”。由于这种设计,可以编写不会被解释为 XML 标记的文本。如果 XML 文件内有一个在信息中存储 XML 标记的实体,这将很有用。例子:
<?xml version="1.0" encoding="UTF-8" ?>
<bean>
    <information>
        <![CDATA[<name>Ivan</name><age>26</age>]]>
    </information>
</bean>
XML 的特点是您可以按照您想要的方式扩展它:使用您自己的元素、您自己的属性,并按照您的意愿构造它。您可以使用属性和元素来存储数据(如前面的示例所示)。但是,您需要了解,您可以随心所欲地随意想出自己的元素和属性,但是如果您从事的项目中另一个程序员想要将名称元素移动到属性中,以及您的整个程序逻辑,该怎么办是这样写的,名字就是一个元素吗?如何创建自己的关于元素应该是什么、它们具有什么属性以及其他内容的规则,以便您可以验证 XML 文件并确保这些规则将成为您项目中的标准并且没有人会违反它们?为了编写您自己的 XML 标记的所有规则,有一些特殊的工具。最著名的是:DTD 和 XML Schema。本文只讲第一个。

DTD

DTD 是为了描述文档类型而创建的。DTD 已经过时,并且现在在 XML 中被积极放弃,但仍然有许多 XML 文件使用 DTD,一般来说,理解 DTD 很有用。 DTD 是一种验证 XML 文档的技术。DTD 声明文档类型的特定规则:其元素、元素内可以包含哪些元素、属性、是否必需、重复次数以及实体。与 XML 类似,DTD 可以通过示例进行可视化,以获得更清晰的解释。
<!-- Объявление возможных элементов -->
<!ELEMENT employee EMPTY>
<!ELEMENT employees (employee+)>
<!ELEMENT office (employees)>
<!ELEMENT offices (office+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (name, offices)>

<!-- Добавление атрибутов для элементов employee и office -->
<!ATTLIST employee
        name CDATA #REQUIRED
        job  CDATA #REQUIRED
>

<!ATTLIST office
        floor CDATA #REQUIRED
        room  CDATA #REQUIRED
>

<!-- Добавление сущностей -->
<!ENTITY M "Maksim">
<!ENTITY I "Ivan">
<!ENTITY F "Franklin">
这里我们有一个这样简单的例子。在此示例中,我们声明了 XML 示例中的整个层次结构:员工、员工、办公室、办公室、姓名、公司。要创建 DTD 文件,有 3 种主要结构用于描述任何 XML 文件:ELEMENT(描述元素)、ATTLIST(描述元素属性)和 ENTITY(用缩写形式替换文本)。 ELEMENT 用于描述元素。可以在所描述的元素中使用的元素以列表形式列在括号中。您可以使用量词来指示数量(它们与正则表达式中的量词类似): +means1+ *表示0+ ?意思0OR1 如果未添加量词,则假定应该只有 1 个元素。 如果我们需要一组元素中的一个,我们可以这样写:
<!ELEMENT company ((name | offices))>
然后会选择其中一个元素:名称或办公室,但如果公司内部有其中两个,则验证不会通过。您还可以注意到,employee 中有单词 EMPTY - 这意味着该元素必须为空。还有 ANY - 任何元素。#PCDATA – 文本数据。 ATTLIST 用于向元素添加属性。ATTLIST 之后是所需元素的名称,后面是“属性名称 - 属性类型”形式的字典,最后可以添加#IMPLIED(可选)或#REQUIRED(必需)。CDATA——文本数据。还有其他类型,但它们都是小写的。 ENTITY ENTITY 用于声明缩写词以及将放置在缩写词上的文本。事实上,我们可以在 XML 中使用前面带有 & 符号的实体名称,而不是全文。后。例如:为了区分 HTML 标记和字符,左尖括号通常用 lt 转义;,你只需要把 & 放在 lt 之前。那么我们就不会使用标记,而只是使用 < 符号。正如您所看到的,一切都非常简单:声明元素,解释声明的元素能够包含哪些元素,向这些元素添加属性,如果需要,您可以添加实体以缩短某些条目。在这里您可能会问:如何在 XML 文件中使用我们的规则?毕竟,我们只是声明了规则,但没有在 XML 中使用它们。在 XML 中使用它们的方法有两种: 1. 嵌入 - 将 DTD 规则写入 XML 文件本身,只需在 DOCTYPE 关键字后面写入根元素,并将 DTD 文件括在方括号内。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE company [
        <!-- Объявление возможных элементов -->
        <!ELEMENT employee EMPTY>
        <!ELEMENT employees (employee+)>
        <!ELEMENT office (employees)>
        <!ELEMENT offices (office+)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT company (name, offices)>

        <!-- Добавление атрибутов для элементов employee и office -->
        <!ATTLIST employee
        name CDATA #REQUIRED
        job  CDATA #REQUIRED
        >

        <!ATTLIST office
        floor CDATA #REQUIRED
        room  CDATA #REQUIRED
        >

        <!-- Добавление сущностей -->
        <!ENTITY M "Maksim">
        <!ENTITY I "Ivan">
        <!ENTITY F "Franklin">
]>

<company>
    <name>IT-Heaven</name>
    <!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="&M;" job="Middle Software Developer" />
                <employee name="&I;" job="Junior Software Developer" />
                <employee name="&F;" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
2. 导入 - 我们将所有规则写入一个单独的 DTD 文件中,之后在 XML 文件中我们使用第一种方法中的 DOCTYPE 构造,只需写入 SYSTEM 代替方括号,并指定到该文件的绝对或相对路径文件的当前位置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE company SYSTEM "dtd_example1.dtd">

<company>
    <name>IT-Heaven</name>
    <!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="&M;" job="Middle Software Developer" />
                <employee name="&I;" job="Junior Software Developer" />
                <employee name="&F;" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
您还可以使用 PUBLIC 关键字代替 SYSTEM,但它不太可能对您有用。如果您有兴趣,您可以在这里详细阅读它(以及系统):链接。现在,如果没有在 DTD 中声明,我们就不能使用其他元素,并且所有 XML 都遵守我们的规则。您可以尝试在 IntelliJ IDEA 中以 .xml 扩展名的单独文件中编写此代码,并尝试添加一些新元素或从 DTD 中删除元素,并注意 IDE 将如何向您指示错误。然而,DTD 也有其缺点:
  • 它有自己的语法,与 xml 语法不同。
  • DTD 没有数据类型检查,只能包含字符串。
  • DTD 中没有命名空间。
关于你自己语法的问题:你必须同时理解两种语法:XML和DTD语法。它们是不同的,这可能会让您感到困惑。此外,正因为如此,结合相同的 DTD 模式来跟踪大型 XML 文件中的错误变得更加困难。如果某些东西不适合你,你必须检查大量具有不同语法的文本。这就像同时阅读两本书:俄语和英语。如果你对一种语言的了解较差,那么理解文本也会同样困难。关于数据类型检查的问题:DTD 中的属性确实有不同的类型,但它们的核心都是某种东西、列表或链接的字符串表示。然而,你不能只要求数字,尤其不能要求正数或负数。您可以完全忘记对象类型。最后一个问题将在下一篇文章中讨论,该文章将专门讨论命名空间和 XML 模式,因为在这里讨论它是没有意义的。感谢大家的关注,为了按时完成整个系列文章,我做了很多工作并继续做下去。基本上,我只需弄清楚 XML 模式并用更清晰的语言对其进行解释即可完成第二篇文章。已经完成一半了,很快就可以期待了。上一篇文章将完全致力于使用 Java 处理 XML 文件。祝大家好运,编程成功 :) 下一篇文章:[竞赛] Java 程序员的 XML 基础知识 - 第 2 部分(共 3 部分)
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION