JavaRush /Java 博客 /Random-ZH /Java 中的 XML:它是什么?

Java 中的 XML:它是什么?

已在 Random-ZH 群组中发布
你好!今天我们将了解另一种数据格式,称为 XML。这是一个非常重要的话题。在开发真正的 Java 应用程序时,您几乎肯定会遇到与 XML 相关的问题。这种格式在 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>。它也称为“root”——根标签。<carstore> 有一个子标签 <car>。反过来,<car> 也有 3 个自己的子标签 - <model>、<year> 和 <price>。每个标签都可以有属性 - 附加的重要信息。在我们的示例中,<model> 标签有一个属性“lang” - 模型名称的书写语言:
<model lang="en">Scania R 770</model>
这样我们就可以表明标题是用英文写的。我们的 <price> 标签有一个“currency”属性。
<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>
现在我们的程序将能够区分实体!任何带有玩具前缀的东西都将被归类为玩具:)但是,我们还没有完成。要使用前缀,我们需要将每个前缀注册为命名空间。好吧,实际上,“注册”是一个很强烈的词:)您只需为每个都想出一个唯一的名称即可。就像类一样:类有一个短名称 ( Cat) 和一个包含所有包的全名称 ( zoo.animals.Cat) 要创建唯一的命名空间,通常使用 URI。有时,此处会替换互联网地址,其中详细描述了该名称空间的功能和用途。但这不一定是有效的互联网地址。很多时候,项目只是使用类似 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 的站点 ,但是有有用的信息:来自“department2”部门的开发人员组“developersgroup1”负责创建“真正的”命名空间。如果您需要添加新名称,或与他们讨论可能的冲突,我们知道该向何处寻求帮助。有时,带有此名称空间描述的真实互联网地址被用作名称空间的唯一名称。例如,如果它是一家大公司,它的项目将被全球数百万人使用。但这并不总是可行:Stackoverflow上对此问题进行了讨论。原则上,使用 URI 作为命名空间名称的要求并不严格:您可以只使用随机字符串。此选项也将起作用:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
但使用 URI 有很多优点。您可以在此处阅读有关此内容的更多信息。

基本 XML 标准

XML 标准是一组向 xml 文件添加附加功能的扩展。 XML 有很多标准,但我们只关注最重要的标准,并了解它们允许 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 文件中的某些实体定义允许的元素列表。例如,我们正在开发一个书店网站,所有开发团队都同意对于 book 元素,只应在 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” 还有许多其他 XML 标准。您可以熟悉它们中的每一个,并尝试深入研究WC3 网站上的代码(“重要 XML 标准”部分)。一般来说,如果您需要有关 XML 的信息,您几乎可以在那里找到所有内容 :) 好了,我们的讲座已经结束了。是时候回去执行任务了!:) 再见!
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION