📜  在 Scala 中使用 XML

📅  最后修改于: 2022-05-13 01:54:38.699000             🧑  作者: Mango

在 Scala 中使用 XML

数据科学家和机器学习工程师通常不知道他们获得的大部分数据通常是 CSV,有时是 JSON 文件格式。然而,这是一个积极的发展,因为我们必须处理大量数据,并且任何使读取和解释数据变得简单的格式都应该受到高度重视。而那些处理 CSV 数据格式的人都非常清楚这种数据格式的优点。

话虽如此,但情况可能并非总是如此。除非您完全使用另一种语言(例如Python),否则您很可能在Java环境中工作。我们也更有可能接收 XML 格式的数据,而不是任何其他格式的数据,因为 XML 长期以来一直是数据传输的标准。因此,我们需要从 XML 文件中提取数据,并根据我们收集的信息创建数据管道。

XML 究竟是什么?

使用代表可扩展标记语言的 XML,旨在使计算机和人都能够掌握文档的内容。毫无疑问,设计师从非常流行的 HTML 中汲取了灵感。也许您声称没有人理解 HTML 并且我们只看到浏览器提供的最终结果是正确的。可能预期 XML 将仅由开发人员查看,因此,它应该可以工作。然而,后来,我们转向了面向服务的体系结构 (SOA),其中 XML 已成为服务间通信的事实上的标准数据格式。这里我们将看看如何在 Spark-Scala 中解析 XML,这将在下一篇文章中介绍。

XML 的目的是什么?

在生成 XML 文档时,我们可能会以类似于我们在构建 HTML 文档时标记数据的方式标记数据。 XML 结合了 HTML 的许多重要特性,但同时也是为了解决 HTML 的一些缺点而创建的。 XML 标记实际上是由用户创建并存储在模式中的,该模式可以是文档类型定义 (DTD),也可以是用 XML 模式编程语言编写的文档。此外,命名空间可能有助于保证您对我们的 XML 文档具有不同的标签。 XML 的语法比 HTML 有更多的限制,但是,这会导致更快和更便宜的冲浪。构建我们自己的标记系统的选项为我们提供了对数据进行分类和排列的自由,以方便检索和易于呈现。数据存储和检索、跨不同系统的数据传输、数据转换和信息表示目前都可以使用已用于发布的 XML。随着 XML 的成熟和功能越来越强大,XML 可以实现单源数据检索和数据表示。

在 Scala 中使用 XML:

Scala 尊重 XML,就好像它是社区的一流成员一样。在这种情况下,我们可以将它们直接插入到我们的代码中,而不是将 XML 文档嵌入到字符串中,就像我们插入一个 int 或 double 数字一样。

例如:我们可以生成一个名为 XML 的 val 并将示例 XML 内容应用到它。解析后会创建一个新的 scala.xml 实例。元素。 Scala 包 scala.xml 提供了生成 XML 文档、处理它们、读取它们并保存它们的类。

Scala
scala> val xml = Hi
xml: scala.xml.Elem = Hi
  
scala> xml.getClass
res2: Class[_ <: scala.xml.Elem] = class scala.xml.Elem


Scala
scala> val xmlDoc =
322
244


Scala
scala> val children = xmlDoc \ "symbol"
scala> children: scala.xml.NodeSeq = NodeSeq(322, 244)


Scala
val grandChildren = xmlDoc \\ "units"
grandChildren: scala.xml.NodeSeq = NodeSeq(100, 315)


让我们来看看如何破译它。 XPath 是用于查询 XML 文件内容的强大工具。 Scala 包含与 XPath 类似的查询功能,但有一些细微差别。在 XPath 中,我们使用正斜杠“/”和“//”来查询 XML 文档。但是,在 Scala 中,“/”符号用作除法运算符,而“//”符号用于注释代码。在与 XML 文档交互时,Scala 喜欢使用反斜杠“”和“.”。

举个例子,

斯卡拉

scala> val xmlDoc =
322
244

我们想要掌握符号组件。我们可以使用 XPath 查询来做到这一点。

斯卡拉

scala> val children = xmlDoc \ "symbol"
scala> children: scala.xml.NodeSeq = NodeSeq(322, 244)

我们在 XML 元素上使用了 ()函数,并指示它搜索任何符号元素。它返回一个 scala.xml 对象作为实例。 NodeSeq 是代表 XML 节点集合的 XML 节点集合。

由()函数搜索的只是目标元素的直接后代元素(即符号)。如果我们想搜索从目标元素开始的层次结构中的所有项目,我们可以使用 _()函数来执行此操作。

斯卡拉

val grandChildren = xmlDoc \\ "units"
grandChildren: scala.xml.NodeSeq = NodeSeq(100, 315)

我们可以使用 text函数访问元素内包含的文本节点。