CodeGym /Java 博客 /随机的 /Java 中的 XML
John Squirrels
第 41 级
San Francisco

Java 中的 XML

已在 随机的 群组中发布
你好!今天我们将介绍另一种数据格式,称为XML。这是一个非常重要的话题。在处理真正的 Java 应用程序时,您几乎肯定会遇到与 XML 相关的任务。在 Java 开发中,这种格式几乎被普遍使用(我们将在下面找出原因),所以我建议你不要肤浅地复习这节课,而是深入了解一切,并研究额外的文献/链接 :) 这个绝对不会浪费时间。那么,让我们从简单的事情开始:“什么”和“为什么”!

什么是 Java XML?

XML 代表可扩展标记语言。您可能已经熟悉一种标记语言——您听说过用于创建网页的 HTML :) 什么是XML? - 1HTML 和 XML 甚至具有相似的外观:
HTML 1

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 1

<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML 2

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 2

<chief>title</chief>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
换句话说,XML 是一种描述数据的语言。

为什么需要 XML?

XML 最初是为了更方便地存储和发送数据而发明的,包括通过 Internet。它有几个优势可以帮助您实现这一目标。首先,它很容易被人和计算机阅读。我想你可以很容易地理解这个 XML 文件描述的内容:

<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
计算机也很容易理解这种格式。其次,由于数据是以纯文本形式存储的,当我们将其从一台计算机传输到另一台计算机时,不会出现兼容性问题。了解 XML 不是可执行代码很重要——它是一种数据描述语言。使用 XML 描述数据后,您需要编写可以发送/接收/处理此数据的代码(例如,在 Java 中)。

XML 是如何构造的?

主要组成部分是标签:这些是尖括号中的东西:

<book>
</book>
有开始标签和结束标签。结束标记有一个附加符号 (" / "),如上例所示。每个开始标签都必须有一个结束标签。它们显示文件中每个元素的描述开始和结束的位置。标签可以嵌套!在我们的图书示例中,<book> 标签有 3 个嵌套标签:<title>、<author> 和 <year>。这不限于一层嵌套:嵌套标签可以有自己的嵌套标签等。这种结构称为标签树。让我们使用描述汽车经销商的示例 XML 文件来查看此树:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
这里我们有一个顶级标签:<carstore>。它也被称为根元素。<carstore> 有一个子标签:<car>。<car> 也有 3 个子标签:<model>、<year> 和 <price>。每个标签都可以有属性,这些属性包含额外的重要信息。在我们的示例中,<model> 标签有一个“lang”属性,表示用于记录模型名称的语言:

<model lang="en">Scania R 770</model>
这里我们指出名称是用英文写的。我们的 <price> 标签有一个“货币”属性。

<price currency="US dollar">150000.00</price>
这里我们指出汽车的价格是以美元给出的。因此,XML 具有“自描述”语法。您可以添加描述数据所需的任何信息。此外,在文件的顶部,您可以添加一行指示 XML 版本和用于写入数据的编码。这称为“prolog”,它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
我们使用 XML 1.0 版和 UTF-8 编码。这不是必需的,但如果您的文件使用不同语言的文本,它会派上用场。我们提到 XML 的意思是“可扩展标记语言”,但是“可扩展”是什么意思呢?这意味着它非常适合创建新版本的对象和文件。例如,假设我们也想在我们的汽车经销商处开始销售摩托车!也就是说,我们需要我们的程序需要支持 <carstore> 的两个版本:旧版本(没有摩托车)和新版本。这是我们的旧版本:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
这是新的扩展版:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
这就是将摩托车的描述添加到我们的文件中是多么容易和简单:) 而且,我们绝对不需要为摩托车使用与汽车相同的子标签。请注意,与汽车不同,摩托车有一个 <owner> 元素。这不会阻止计算机(或人)读取数据。

XML 和 HTML 之间的差异

我们已经说过,XML 和 HTML 在外观上非常相似。这使得了解它们的不同之处变得非常重要。首先,它们用于不同的目的。HTML 用于标记网页。例如,在创建网站时,您可以使用 HTML 指定:“菜单应该在右上角。它应该有这样那样的按钮”。换句话说,HTML 的工作是显示数据。XML 用于以方便人类和计算机的形式存储和发送信息。此格式不包含任何有关应如何显示此数据的指示:这取决于读取它的程序代码。其次,存在重大的技术差异。HTML 标签是预定义的。换句话说,创建 HTML 标头(例如,页面顶部的大标题)仅使用 <h1></h1> 标签(<h2></h2> 和 <h3></h3> 用于较小的标题)。您不能使用其他标记创建 HTML 标头。XML 不使用预定义的标签。您可以给标签起任何您想要的名称:<header>、<title>、<idontknow2121>。

解决冲突

XML 提供的自由可能会导致一些问题。例如,同一个实体(例如,一辆汽车)可以被程序用于不同的目的。例如,我们有一个描述汽车的 XML 文件。但是,我们的程序员之间并没有事先达成一致。现在,除了关于真车的数据外,我们还可以在 XML 中找到关于玩具车的数据!而且,它们具有相同的属性。假设我们的程序读取这样一个 XML 文件。我们如何区分真车和玩具车?

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
这里的前缀和命名空间将帮助我们。为了在我们的程序中区分玩具汽车和真实汽车(实际上是任何玩具与其真实对应物),我们引入了两个前缀:“real”和“toy”。

<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
现在我们的程序就能区分不同的实体了!所有带有 toy 前缀的都将被视为玩具 :) 然而,我们还没有完成。要使用前缀,我们需要将它们中的每一个注册为一个命名空间。实际上,“注册”是一个很重要的词 :) 我们只需要为它们中的每一个起一个唯一的名字。这就像类:一个类有一个短名称 ( Cat ) 和一个包含所有包的完全限定名称 ( zoo.animals.Cat). URI 通常用于创建唯一的名称空间名称。有时这是使用 Internet 地址完成的,其中描述了此命名空间的功能。但它不必是有效的 Internet 地址。通常,项目只是使用类似 URI 的字符串来帮助跟踪命名空间层次结构。这是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
当然,在“http://testproject.developersgroup1.companyname/department2/namespaces/real”处没有网站,但这个字符串确实包含有用的信息:部门 2 中的 Group 1 的开发人员负责创建“real”命名空间. 如果我们需要引入新名称或讨论可能的冲突,我们会知道该去哪里。有时,开发人员使用真实的描述性网址作为唯一的命名空间名称。例如,一家大公司的项目可能会被全球数百万人使用。但这当然并不总是如此:Stack Overflow对此问题进行了讨论。通常,没有严格要求使用 URI 作为名称空间名称:您也可以简单地使用随机字符串。这个选项也可以工作:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
也就是说,使用 URI 有几个优点。您可以在此处阅读更多相关信息。

基本的 XML 标准

XML 标准是一组向 XML 文件添加额外功能的扩展。XML 有很多标准,但我们只看最重要的标准,就会发现它们使 AJAX 成为可能,AJAX 是最著名的 XML 标准之一。它使您无需重新加载即可更改网页的内容!XSLT 允许您将 XML 文本转换为其他格式。例如,您可以使用 XSLT 将 XML 转换为 HTML!正如我们所说,XML 的目的是描述数据,而不是显示数据。但是使用 XSLT 我们可以绕过这个限制!XML DOM 允许您从 XML 文件中检索、修改、添加或删除单个元素。这是一个如何工作的小例子。我们有一个 books.xml 文件:

<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J. K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
它有两本书。书籍有一个 <title> 元素。在这里,我们可以使用 JavaScript 从我们的 XML 文件中获取所有的书名,并将第一个打印到控制台:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
DTD(“文档类型定义”)允许您为 XML 文件中的实体定义允许的元素列表。例如,假设我们正在一个书店网站上工作,并且所有开发团队都同意只应为 XML 文件中的书籍元素指定标题、作者和年份属性。但是我们如何保护自己免受粗心大意呢?好简单!

<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
这里我们为 <book> 定义了一个有效属性列表。尝试在那里添加一个新元素,你会立即得到一个错误!

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
错误!“Element mainhero is not allowed here” 还有很多其他的 XML 标准。您可以熟悉它们中的每一个,并尝试更深入地研究代码。不管怎样,如果您需要有关 XML 的信息,几乎可以在那里找到所有信息 :) 至此,我们的课程就结束了。是时候回到任务中了!:) 直到下一次!
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION