Java Xml 简明教程

Java XML Overview

Java XML 只是通过 Java 程序处理 XML 文档。想象一下,我们有一个文件“products.xml”,其中包含产品详细信息,如名称、品牌和价格。

现在,我们希望使用 Java 编程为某些产品更新价格。在编写此类 Java 程序以访问 XML 文档之前,我们应该了解 XML 基础知识。

What is XML?

XML 是 E*X*tensible *M*arkup *L*anguage 的缩写。它是一种基于文本的标记语言,它用于存储和传输数据。它是自描述的,既可以让人阅读,也可以机器识别。以下是 XML 的一些重要要点 −

  1. XML 是一种标记语言。

  2. XML 是一种基于标记的语言,如 HTML。

  3. XML 标记不是预定义的,如 HTML。

  4. 您可定义自己的标记,这就是为什么它被称为可扩展语言。

  5. XML 标记被设计为自描述的。

  6. XML 是 W3C 对数据存储和数据传输的建议。

XML Document

XML 文档是按结构化有条理的方式定义数据的元素集合。XML 文档有两节,分别是 document prologdocument elements

Syntax

以下是 XML 文档的语法 −

<?xml ?>
<root_element>
	<element></element>
	...
</root_element>

其中,

  1. &lt;?xml ?&gt; 是 XML 声明语句。如果包括此语句,则必须将其放在第一行。

  2. &lt;root_element&gt; 是根元素,它是所有其他元素的父元素。

  3. &lt;element&gt; 是根元素的子元素。

Example

以下示例显示了以 <Employee> 作为根元素、 <name><role><salary> 作为子元素的员工详细信息。每个元素的数据都用开放标记和关闭标记括起来。

<?xml version="1.0" ?>
<Employee>
	<name>Kiran</name>
	<role>developer</role>
	<salary>25,000</salary>
</Employee>

Elements in XML

元素是 XML 文档的构建基块。它由开放标记、内容和关闭标记组成。在 xml 文档中,应该始终有一个根元素,我们可以在其中编写多个子元素。元素也可能包含任意数量的属性。

Syntax

以下是 XML 元素的语法 −

<root>
	<child>
		<subchild>.....</subchild>
	</child>
</root>

其中,

  1. &lt;root&gt; 是 XML 文档的根元素。

  2. &lt;child&gt; 是子元素,其父元素是根元素。

  3. &lt;subchild&gt; 是子子元素,其父元素是子元素。

Example

让我们来看一个例子,其中 DOB(出生日期)被进一步细分为日期、月份和年份。在这里, <DOB> 是根元素, <date><month><year> 是子元素。

<DOB>
	<date>27</date>
	<month>March</month>
	<year>2000</year>
</DOB>

Tags in XML

XML 中的标记是自解释的和用户定义的。这些标记括在小于 ( < ) 和大于 ( > ) 符号中。XML 区分大小写,因此开放标记和关闭标记应具有相同的名称。

Example

在以下示例中,我们已经使用开放和关闭标记编写了一个地址元素。

<address>Hyderabad</address>

现在,让我们来看看一些 incorrect 编写 XML 标记的方法:

<Address></address>
<ADDRESS></address>

Attributes in XML

XML 中的元素可以具有属性。属性是 name-value 对,它们提供了有关特定元素的进一步具体信息。一个元素可以具有任意数量的属性。

Syntax

下面是 XML 特性的语法 −

<element_name attribute_name="value" >content</element_name>

其中,

  1. element_name 是元素的名称。

  2. attribute_name 是特性的名称。

  3. value 是对应特性的值。

Example

现在,我们看一看以下例子,其中“Student”元素有四个特性,即 name、class、marks 和 DOB。

<Student name="Kiran" class="8" marks="50" DOB="27-03-2000"></Student>

Using sub elements to replace attributes

除了特性,也可以在元素中使用子元素,以实现与特性相同的功能。相同的 student 示例也可以写成如下形式:

<Student>
	<name>Kiran</name>
	<class>8</class>
	<marks>50</marks>
	<DOB>27-03-2000</DOB>
</Student>

在上述示例中,如果我们进一步需要以日期、月份和年份来表示出生日期,那么可以通过对 DOB 元素使用子元素来实现,如下所示:

<Student>
	<name>Kiran</name>
	<class>8</class>
	<marks>50</marks>
	<DOB>
		<date>27</date>
		<month>03</month>
		<year>2000</year>
	</DOB>
</Student>

XML Declaration

XML 声明描述了有关整个 XML 文档的基本格式信息,如版本、编码和独立状态。如果文档中包含 XML 声明,则必须将其写在第一行。

Syntax

下面是 XML 声明的语法 −

<?xml
	version="version_number"
	encoding="encoding_type"
	standalone="standalone_status"
?>

其中,

  1. XML 声明以字符序列 &lt;?xml 开始,以字符序列 ?&gt; 结束

  2. version 是 XML 中使用的版本号

  3. encoding 是用于 XML 文档内容的字符编码

  4. standalone 是一个布尔特性,其默认值设置为“no”。这会告知 XML 文档是独立的,还是使用来自外部源的信息来解析文档,如 DTD(文档类型定义)。默认值设置为“no”。

Example

以下示例使用 XML 1.0 版本,编码类型为 UTF-16 并且为独立的。

<?xml
	version="1.0"
	encoding="UTF-16"
	standalone="yes"
?>

XML Comments

XML 中的注释用于解释文档的用途和详细信息。始终建议在文档中包含注释,因为它使从未阅读过该文档的人更容易理解该文档。XML 遵循与 HTML 相同的语法。

Syntax

下面是单行和多行 XML 注释的语法 −

<!-- comment here -->

Example

假设我们在 2015 年收集了某所大学的学院信息。这些记录可能会在数年内发生变化。因此,在注释中提及这一点有助于正在编辑的人了解收集这些详细信息的时间。

<?xml version = "1.0" encoding = "UTF-8" ?>
<!-- Following information is collected in the year 2015 -->
<college>
	<Department>
		<name>CSE</name>
		<code>CS</code>
		<faculty_strength>25</faculty_strength>
	</Department>
	<Department>
		<name>ECE</name>
		<code>EC</code>
		<faculty_strength>20</faculty_strength>
	</Department>
</college>

XML Namespaces

XML 命名空间用于解决 XML 文档中的命名冲突。当添加两个或多个 XML 片段时,则这些 XML 代码片段可能会使用一些具有相同名称的标记。这会让 XML 解析器感到困惑。为了避免此类命名冲突,请使用 XML 名称空间。

Example

假设我们创建了一个 XML 元素,用于保存有关茶几的信息 −

<table>
	<shape>Oval</shape>
	<material>Wood</material>
	<seat_count>3</seat_count>
	<cost>15000</cost>
</table>

假设我们已经创建了另一个用于存储有关餐桌的信息的元素,如下所示:

<table>
	<shape>Rectangle</shape>
	<material>Marble</material>
	<seat_count>6</seat_count>
	<cost>25000</cost>
</table>

当上述两个 XML 代码片段(放在单个文件中)添加在一起时,将发生名称冲突。虽然两个元素的名称相同,但它们提供的信息各不相同。有两种方法可以在 XML 中解决这些名称冲突。它们是:

  1. Using Prefix

  2. Using namespace declaration

Using Prefix

我们可以通过向元素添加前缀使之彼此区分。为了解决上述名称冲突,我们可以向保存咖啡桌信息的元素添加前缀“c”,类似地,我们可以向另一个元素(餐桌)添加前缀“d”。

Example

让我们采用相同的表格示例,并尝试使用前缀解决名称冲突。

<!-- Coffee Table -->
<c:table>
	<shape>Oval</shape>
	<material>Wood</material>
	<seat_count>3</seat_count>
	<cost>15000</cost>
</table>

<!-- Dining Table -->
<d:table>
    <d:shape>Rectangle</d:shape>
    <d:material>Marble</d:material>
    <d:seat_count>6</d:seat_count>
    <d:cost>25000</d:cost>
</d:table>

Drawbacks of Using Prefixes

在使用前缀时,仍有可能出现两个元素具有与名称相同的前缀的情况。在这种情况下,冲突依然存在。

假设假如我们添加另一个元素来提供有关梳妆台的信息,则为了区分这些元素,我们需要使用前缀“d”。这再次导致餐桌和梳妆台之间出现冲突。因此,使用前缀可以在某种程度上解决冲突,但做不到彻底解决。

Using "namespace" Declaration

XML 命名空间声明用于有效解决名称冲突。使用名为“xmlns”的新属性。

Syntax

以下是 XML 命名空间的语法:

<element-name xmlns:prefix="URI">

其中,

  1. element-name :使用命名空间的元素名称。

  2. xmlns :声明命名空间的强制性关键字。

  3. prefix: Namespace prefix

  4. URI: Namespace identifier

Example

以下示例对三个表格标记使用了 XML 命名空间声明。现在,通过在其命名空间 URI 中进行区分,解决了餐桌和梳妆台之间的冲突。

<!-- Coffee Table -->
<h:table xmlns:h="/coffee">
<c:table>
	<shape>Oval</shape>
	<material>Wood</material>
	<seat_count>3</seat_count>
	<cost>15000</cost>
</table>

<!-- Dining Table -->
<d:table xmlns:h="/dining">
    <d:shape>Rectangle</d:shape>
    <d:material>Marble</d:material>
    <d:seat_count>6</d:seat_count>
    <d:cost>25000</d:cost>
</d:table>

<!-- Dressing Table -->
<d:table xmlns:h="/dressing">
    <d:brand>Trevi Furniture</d:brand>
    <d:material>Engineered wood</d:material>
    <d:cost>15000</d:cost>
</d:table>