Logo
Section 1 / 11

JSON 和 XML

让我们开始学习重要的数据格式,即 JSON 和 XML。

导入

JSON 和 XML

让我们开始学习重要的数据格式,即 JSON 和 XML。

处理 XML 和 JSON 数据

长期以来,XML 是程序员进行开放数据交换的首选格式,也是唯一的选择。然而近年来,由于其轻量级特性和更快的解析速度,JSON 也逐渐获得了广泛流行。尽管存在这些差异,但两者都被全球主要编程语言所采用。在本章中,我们将深入探讨如何读取/解析、构建 XML 和 JSON 格式,并尝试理解这两种格式下的序列化与反序列化机制。

JSON 与 XML 的区别

总体而言,JSON 是 XML 的轻量级版本,两者之间并无绝对优劣之分。最终选择应根据具体需求和实际使用场景来决定。

XML 代表 可扩展标记语言,是一种开源语言,被全球程序员广泛用于存储、持久化和传输结构化数据,以便其他程序或软件能够独立于底层操作系统读取数据。这是因为 XML 数据可以保存在文本文件中,并可在任何操作系统上共享或交换。它特别适合以简单、人类和机器均可读的结构化格式存储少量数据,而无需依赖 SQL 数据库。

XML 示例:

1<employees> 2 <employee> 3 <first>Prateek</first> 4 <last>Singh</last> 5 </employee> 6 <employee> 7 <first>Peter</first> 8 <last>Parker</last> 9 </employee> 10</employees>

JSON 代表 JavaScript 对象表示法,是一种简洁的文本格式,用于存储数据以及在程序、浏览器(客户端)和服务器之间交换信息。它已逐步成为各种应用场景中最受欢迎和首选的数据交换格式之一,目前被大多数现代编程语言支持。

JSON 示例:

1{"employees":[ 2 { "first":"Prateek", "last":"Singh" }, 3 { "first":"Peter", "last":"Parker" } 4]}
JSONXML
全称为 JavaScript 对象表示法全称为 可扩展标记语言
数据导向文档导向
易于阅读和编写比 JSON 更复杂
更简洁、轻量,解析更快比 JSON 更冗长
不支持直接显示内容支持数据显示及样式转换(如 XSLT)
支持数组XML 不直接支持数组

从文件读取 XML

PowerShell 可访问 .Net 类 System.Xml.XmlDocument,可用于加载 XML 文档并解析其内容。我们只需使用 New-Object 命令创建该类的实例,然后调用 Load() 方法,传入有效的文件路径来加载 XML 文件。文件加载后,系统会解析 XML 文档并将其转换为 PowerShell 对象。在我们的示例中,有一个名为 test.xml 的 XML 文件,其中包含员工数据,如 ID、名字和姓氏,以嵌套的子标签(如 <id>..</id>、<first>..</first>)形式存储在父标签(如 <employee>..</employee>)下。

1<data> 2 <employee> 3 <id>101</id> 4 <first>Prateek</first> 5 <last>Singh</last> 6 </employee> 7 <employee> 8 <id>102</id> 9 <first>Bob</first> 10 <last>Francis</last> 11 </employee> 12</data>
1$xmldoc = New-Object System.Xml.XmlDocument 2$xmldoc.Load('C:\Temp\test.xml') # XML 文件路径 3$xmldoc.data.employee

另一种方法是使用 Get-Content 命令读取 XML 文件内容,然后将其强制转换为 [XML] PowerShell 类型加速器,这是 System.Xml.XmlDocument 类的简写形式。

1$data = [XML] (Get-Content /usercode/Test.xml) 2$data.data.employee

Python 也通过内置模块 xml 提供了 XML 解析功能,该模块包含一个名为 xml.etree.ElementTree 的子模块。我们可以将 ElementTree 模块导入为变量(例如 et),然后使用 parse() 函数加载 XML 文件(提供有效路径),使文件内容被解析为一个 XML 树结构。该 XML 树的入口点是根节点(即顶层节点),可通过 getroot() 函数获取。为了进一步遍历子节点,可以使用 getchildren() 函数,该函数返回指定父节点的所有子节点。如下例所示,我们已将 XML 文档解析为一个包含员工数据的哈希表列表。

1# 使用 ElementTree 读取/解析 XML 2import xml.etree.ElementTree as ET 3 4# 解析为 XML 文档 5tree = ET.parse('/usercode/Test.xml') 6root = tree.getroot() # 获取 XML 根节点 7 8# 遍历子节点并创建哈希表 9employees = [] 10for elem in root: 11 employee = {} 12 for subelem in elem: 13 employee[subelem.tag] = subelem.text 14 employees.append(employee) 15print(employees)

函数

访问 XML