虚拟化分类与 I/O 虚拟化技术概述

提示:

更多互联网技术与咨询分享,欢迎关注公众号:Flowlet

虚拟化技术是实现云计算的基石,虚拟化技术主要由三项关键技术构成:CPU 虚拟化、内存虚拟化和 I/O 虚拟化。I/O 虚拟化作为计算、网络与存储的技术交织点,其重要性与复杂性不言而喻。

I/O 外设资源是有限的,通过 I/O 虚拟化(IOV:I/O Virtualization)技术可以在多个虚拟机之间共享单个 I/O 资源。

本文将详解虚拟化技术分类与实现 I/O 虚拟化的 2 种方式:I/O 模拟(Device emulation) 与 I/O 直通(Device passthrough)。

其中 :

I/O 模拟(Device emulation)可分为:I/O 全虚拟化(I/O Full-virtualization)与 I/O 半虚拟化(I/O Para-virtualization);

I/O 直通(Device passthrough)可分为:设备直通(Direct I/O assignment)与 SR-IOV 直通;

本文主要分为以下几部分:

1、虚拟化介绍

Part I:硬件抽象层虚拟化

Part II:操作系统层虚拟化

Part III:库函数层虚拟化

Part IV:编程语言层虚拟化

2、VMM 介绍

Part I:Type-1(Hypervisor模型/Bare-metal)

Part II:Type-2(宿主机模型/Hosted)

Part III:Type-3/Type-1.5(混合模型/Hybrid)

3、I/O 模拟

Part I:I/O 全虚拟化

Part II:I/O 半虚拟化

4、I/O 直通

Part I:设备直通

Part II:SR-IOV 直通

1、虚拟化介绍

虚拟化分类与 I/O 虚拟化技术概述

在计算机系统中,从底层至高层依次可分为:硬件层、操作系统层、函数库层、应用程序层。

可以对上述 4 层中的任意一层进行虚拟化,在对某层实施虚拟化时,该层和上一层之间的接口不发生变化,而只变化该层的实现方式。对以上 4 层进行虚拟化,可以分别形成以下 4 种虚拟化方式:

1.1 硬件抽象层虚拟化

硬件抽象层上的虚拟化是指通过虚拟硬件抽象层来实现虚拟机,为虚拟机操作系统呈现和物理硬件相同或相近的硬件抽象层,又称为指令集级虚拟化。

实现在此层的虚拟化技术可以对整个计算机系统进行虚拟,即可将一台物理计算机系统虚拟为一台或多台虚拟机。每台虚拟机都拥有自己的虚拟硬件(如 CPU、内存和设备等),来提供一个独立的虚拟机执行环境。

每个虚拟机中的操作系统可以完全不同,并且它们的执行环境是完全独立的。由于虚拟机操作系统所能看到的是硬件抽象层,因此,虚拟机操作系统的行为和在物理平台上没有什么区别

例如:KVM、WMware Workstation、VMware vSphere、Microsoft Hyper-v 都属于硬件抽象层的虚拟化。

1.2 操作系统层虚拟化

操作系统层上的虚拟化是指操作系统的内核可以提供多个互相隔离的用户态实例。这些用户态实例(也就是现在广为人知的:容器)对于它的用户来说就像是一台真实的计算机,有自己独立的文件系统、网络协议栈以及系统设置和库函数等。

由于这是操作系统内核提供的虚拟化,因此操作系统层上的虚拟化通常非常高效,它的虚拟化资源和性能开销非常小,也不需要特殊的硬件支持。但它的灵活性相对较小,每个容器的操作系统和宿主机的操作系统通常必须是同一种操作系统。

另外,操作系统层上的虚拟化虽然为用户态实例间提供了比较强的隔离性,但其粒度是比较粗的。

例如:Docker、Containered 都属于操作系统层的虚拟化。

1.3 库函数层虚拟化

操作系统通常会通过库函数的形式给其他应用程序提供一组通用服务,例如文件操作服务、时间操作服务等。这些库函数可以隐藏操作系统内部的一些细节,使得应用程序编程更为简单。

不同的操作系统库函数有着不同的服务接口,例如 Linux 的服务接口是不同于 Windows 的。库函数层上的虚拟化就是通过将操作系统的应用级库函数的服务接口进行虚拟化,使得应用程序不需要修改,就可以在不同的操作系统中无缝运行,从而提高系统间的互操作性。

例如,Wine 就是在 Linux 上模拟了 Windows 的库函数接口,使得一个 Windows 应用程序能够在 Linux 上正常运行。

1.4 编程语言层虚拟化

编程语言层上的虚拟机称为语言级虚拟机,例如 JVM(Java Virtual Machine)。这一类虚拟机运行的是进程级的作业,所不同的是这些程序所针对的不是一个硬件上存在的体系结构,而是一个虚拟体系结构。

这些程序的代码首先被编译为针对其虚拟体系结构的中间代码,再由虚拟机的运行时支持将中间代码翻译为硬件的机器语言进行执行。

2、VMM 介绍

虚拟化分类与 I/O 虚拟化技术概述

我们本篇讨论的虚拟化是硬件抽象层虚拟化。即:指令集级虚拟化,是最早被提出和研究的一种虚拟化技术,当前存在多种此种技术的具体实现方案,在介绍它们之前,有必要先了解实现系统级虚拟化可采取的途径。

在每台虚拟机中都有属于它的虚拟硬件,通过虚拟化层的模拟,虚拟机中的操作系统认为自己仍然是独占机器在运行,这个虚拟化层被称为虚拟机监控器(Virtual Machine Monitor,VMM)。

VMM 对物理资源的虚拟可以归结为三个主要任务:处理器虚拟化、内存虚拟化和I/O虚拟化。

虚拟化分类与 I/O 虚拟化技术概述

当前企业级主流的 VMM (Virtual Machine Monitor) 主要分为 3 种类型:Type-1(Hypervisor 模型)、Type-2(宿主机模型)、Type-3/Type-1.5(混合模型)。

摩笔天书 摩笔天书

摩笔天书AI绘本创作平台

摩笔天书 135 查看详情 摩笔天书 2.1 Type-1(Hypervisor 模型/ Bare-metal)

Hypervisor 这个术语是在 20 世纪 70 年代出现的,在早期计算机界,操作系统被称为 Supervisor,因而能够运行的其他操作系统的操作系统被称为 Hypervisor。

在 Hypervisor 模型中,VMM 首先可以被看做是一个完备的操作系统,不过和传统操作系统不同的是,VMM是为虚拟化而设计的,因此还具备虚拟化功能。从架构上来看,首先,所有的物理资源如处理器、内存和 I/O 设备等都归 VMM 所有,因此,VMM 承担着管理物理资源的责任;其次,VMM 需要向上提供虚拟机用于运行客户机操作系统,因此,VMM 还负责虚拟环境的创建和管理。

由于 VMM 同时具备物理资源的管理功能和虚拟化功能,因此,物理资源虚拟化的效率会更高一些。Hypervisor 模型在拥有虚拟化高效率的同时也有其缺点。由于 VMM 完全拥有物理资源,因此,VMM 需要进行物理资源的管理,包括设备的驱动。

我们知道,设备驱动开发的工作量是很大的。因此,对于 Hypervisor 模型来说这是个很大的挑战。事实上,在实际的产品中,基于 Hypervisor 模型的 VMM 通常会根据产品定位,有选择地挑选一些 I/O 设备来支持,而不是支持所有的 I/O 设备。

2.2 Type-2 (宿主机模型 / Hosted)

在宿主模型中,物理资源由宿主机操作系统管理。宿主机操作系统是传统操作系统,如 Windows 、Linux 等,这些传统操作系统并不是为虚拟化而设计的,因此本身并不具备虚拟化功能,实际的虚拟化功能由 VMM 来提供。

VMM 通常是宿主机操作系统独立的内核模块,有些实现中还包括用户态进程,如负责 I/O 虚拟化的用户态设备模型。VMM 通过调用宿主机操作系统的服务来获得资源,实现处理器、内存和 I/O 设备的虚拟化。VMM创建出虚拟机之后,通常将虚拟机作为宿主机操作系统的一个进程参与调度。

宿主模型的优缺点和 Hypervisor 模型恰好相反。宿主模型最大的优点是可以充分利用现有操作系统的设备驱动程序,VMM 无须为各类 I/O 设备重新实现驱动程序,可以专注于物理资源的虚拟化。考虑到 I/O 设备种类繁多,千变万化, 设备驱动程序开发的工作量非常大,因此,这个优点意义重大。此外,宿主模型也可以利用宿主机操作系统的其他功能,例如调度和电源管理等,这些都不需要 VMM 重新实现就可以直接使用。

宿主模型当然也有缺点,由于物理资源由宿主机操作系统控制,VMM 得要调用宿主机操作系统的服务来获取资源进行虚拟化,而那些系统服务在设计开发之初并没有考虑虚拟化的支持,因此,VMM 虚拟化的效率和功能会受到一定影响。

2.3 Type-3/Type-1.5(混合模型 / Hybrid)

混合模型是上述两种模式的混合体。VMM 依然位于最低层,拥有所有的物理资源。与 Hypervisor 模式不同的是,VMM 会主动让出大部分 I/O 设备的控制权,将它们交由一个运行在特权虚拟机中的特权操作系统控制。相应地,VMM 虚拟化的职责也被分担,处理器和内存的虚拟化依然由 VMM 来完成,而 I/O 的虚拟化则由 VMM 和特权操作系统共同合作来完成。因此,设备模型模块位于特权操作系统中,并且通过相应的通信机制与 VMM 合作。

混合模型集中了上述两种模型的优点。VMM 可以利用现有操作系统的 I/O 设备驱动程序,不需要另外进行开发。VMM 直接控制处理器、内存等物理资源,虚拟化的效率也比较高。

当然,混合模型也存在缺点。由于特权操作系统运行在虚拟机上,当需要特权操作系统提供服务时,VMM 需要切换到特权操作系统,这里面就产生上下文切换的开销。当切换比较频繁时,上下文切换的开销会造成性能的明显下降。出于性能方面的考虑,很多功能还是必须在VMM 中实现,如调度程序和电源管理等。

虚拟化分类与 I/O 虚拟化技术概述

3、I/O 模拟

虚拟化分类与 I/O 虚拟化技术概述

I/O 模拟(Device emulation)主要分为:I/O 全虚拟化(I/O Full-virtualization)与 I/O 半虚拟化(I/O Para-virtualization)2 种架构。

在讲解这 2 种 I/O 模拟架构之前,我们先看一下目前主流的 2 种 VMM 模型中,设备模拟是如何工作的:

第一种架构中将设备模拟集成到 VMM 中。第二种架构则在 VMM 的外部的应用程序中进行设备模拟。

虚拟化分类与 I/O 虚拟化技术概述

在 VMM 中集成设备模拟是在 VMware workstations 中实现的设备模拟的常用方法。如上图所示,在这个模型中,VMM 包括各种虚拟机操作系统可以共享的公共设备(例如:虚拟磁盘、虚拟网络适配器等)的模拟。

虚拟化分类与 I/O 虚拟化技术概述

如上图所示,第二种架构称为用户空间设备模拟。顾名思义,不是将设备模拟嵌入到 VMM 中,而是在用户进程中实现。QEMU 提供设备模拟,并被大量独立的 VMM(基于内核的虚拟机[KVM])所使用。

此模型的优点是,因为设备模拟独立于 VMM,因此可以在 VMM 之间共享模拟设备。它还可以在不改动 VMM 的同时,进行任意类型的设备模拟。

1.1 I/O 全虚拟化

虚拟化分类与 I/O 虚拟化技术概述

该方式采用软件模拟真实硬件设备。一个设备的所有功能或者总线结构(如设备枚举、识别、中断和DMA)等都可以在 VMM 中模拟。而对虚拟机而言看到的是一个功能齐全的“真实”的硬件设备。其实现上通常需要宿主机上的软件配合截取客户机对 I/O 设备的各种请求,然后通过软件模拟真实的硬件。比如:QEMU/KVM 虚拟化中 QEMU 就可以模拟各种类型的网卡。

这种方式对客户机而言非常透明,无需考虑底层硬件的情况,不需要专有驱动,因此不需要修改操作系统。但是,全虚模型有一个很大的不足之处,即性能不够高,主要原因有两方面:

模拟方式是用软件行为进行模拟,这种方式本身就无法得到很高的性能;这种模型下 I/O 请求的完成需要虚拟机与 VMM 多次的交互,产生大量的上下文切换,造成巨大开销。

虚拟化分类与 I/O 虚拟化技术概述

在 KVM-qemu 模型的虚拟化中,模拟 IO 虚拟化方式的最大开销在于处理器模式的切换:包括从 Guest OS 到 VMM 的切换,以及从内核态的 VMM 到用户态的 IO 模拟进程之间的切换。

1.2 I/O 半虚拟化

虚拟化分类与 I/O 虚拟化技术概述

在这种虚拟化中,客户机操作系统能够感知到自己是虚拟机,I/O 的虚拟化由前端驱动和后端驱动共同模拟实现。

前端/后端架构也称为 “Split I/O”,即将传统的I/O驱动模型分为两个部分,一部分是位于客户机OS内部的设备驱动程序(前端),该驱动程序不会直接访问设备,前端驱动负责接收来自其他模块的I/O操作请求,并通过虚拟机之间的事件通道机制将I/O请求转发给后端驱动,后端驱动可以直接调用物理I/O设备驱动访问硬件。后端在处理完请求后会异步地通知前端。

相比于全虚模型中 VMM 需要截获每个 I/O 请求并多次上下文切换的方式,这种基于请求/事务的方式能够在很大程度上减少上下文切换的频率,并降低开销。但是这种 I/O 模型有一个很大的缺点,要修改操作系统内核以及驱动程序,因此会存在移植性和适用性方面的问题,导致其使用受限。

而在不同的虚拟化机制中,这一过程的实现手段也有所区别,例如:VMware 的 VMXNET2、VMXNET3,KVM 中的 virtio。

虚拟化分类与 I/O 虚拟化技术概述

半虚拟化中的 virtio 是 IBM 于2005年提出的一套方案,经过了十多年的发展,其驱动现在基本已经被主流的操作系统接纳编入内核,因此 virtio 也已经成为 I/O 半虚拟化的事实标准。

4、I/O 直通

虚拟化分类与 I/O 虚拟化技术概述

I/O 直通(Device passthrough)可分为:设备直通(Direct I/O assignment)与 SR-IOV 直通;

2.1 设备直通

虚拟化分类与 I/O 虚拟化技术概述

软件实现 I/O 虚拟化的技术中,所有的虚拟机都共享物理平台上的硬件设备。如果物理条件好,有足够的硬件,就可以考虑让每个虚拟机独占一个物理设备,这样无疑会提高系统的性能。

把某一个设备直接分配给一个虚拟机,让虚拟机可以直接访问该物理设备而不需要通过VMM或被VMM截获,这就是设备直通技术。

在设备直通模型中,虚拟机操作系统可直接拥有某一物理设备的访问控制权限,VMM 不再干涉其访问操作。因此,该模型可以较大地改善虚拟化设备的性能,降低 VMM 程序的复杂性,易于实现,并且不需要修改操作系统,保证了高可用性。

设备直通模型虽然在性能上相比软件方式的两种 I/O 设备虚拟化模型有着很大的提升,但是该模型的使用也是有一定限制的。

因为该模型将一件物理设备直接分配给了一个虚拟机,其它虚拟机是无法使用该设备的,所产生的一个问题就是如果其它虚拟机需要访问该设备则无法满足需求,解决办法就是物理资源充分满足需求或者通过硬件虚拟化技术虚拟出多个 IO 设备(与物理设备性能极为接近)供多个虚拟机使用(硬件必须支持)。

2.2 SR-IOV 直通

虚拟化分类与 I/O 虚拟化技术概述

在I/O 直通技术中,将一件物理设备直接分配给了一个虚拟机,虽然获得近似于直接访问设备的 I/O 性能。但是由于其它虚拟机无法使用该设备的,牺牲了系统的扩展性。

因此,2007年9月,PCI-SIG 官方发布了《Single Root I/O Virtualization and Sharing Specification Revision 1.0》规范,定义了多个 System Images 如何共享 PCI 接口的 I/O 硬件设备。(这里的设备可以是 PCIe 网卡,一块 PCIe SSD 等等)。

SR-IOV 全称 Single Root I/O Virtualization。在SR-IOV中,定义了两个功能类型:

PF(物理功能类型),负责管理 SR-IOV 设备的特殊驱动,其主要功能是提供设备访问功能和全局共享资源配置的功能,虚拟机所有影响设备状态的操作均需通过通信机制向 PF 发出请求完成。

代码语言:javascript代码运行次数:0运行复制

  每个PF都可以被物理主机发现和管理。进一步讲,借助物理主机上的 PF 驱动可以直接访问 PF 所有资源,并对所有 VF 并进行配置,比如:设置 VF 数量,并对其进行全局启动或停止。

VF(虚拟功能类型),是轻量级的 PCIe 功能,包含三个方面:向虚拟机操作系统提供的虚拟网卡;数据的发送、接收功能;与 PF 进行通信,完成全局相关操作。由于 VF 的资源仅是设备资源的子集,因此 VF 驱动能够访问的资源有限,对其它资源的访问必须通过 PF 完成。

代码语言:javascript代码运行次数:0运行复制

  一个或者多个 VF 共享一个 PF,其驱动装在虚拟机上,当 VF 分配给虚拟机以后,虚拟机就能像使用普通 PCIe 设备一样初始化和配置 VF。如果 PF 代表的是一张物理网卡,那么 VF 则是一个虚拟机可以看见和使用的虚拟网卡。

(正文完)

end

Reference:

Virtio: An I/O virtualization framework for LinuxLinux virtualization and PCI passthroughVirtualization Deep DiveWhat is a Virtual Machine?虚拟化技术基础虚拟化技术介绍Virtualization 1 of 4 – HypervisorVMware,Redhat,Citrix和Microsoft 4种主要的网络IO虚拟化模型CNTT Relevant TechnologiesNFV关键技术:计算虚拟化之IO虚拟化

转载与投稿

文章转载需注明:文章来源公众号:Flowlet

以上就是虚拟化分类与 I/O 虚拟化技术概述的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/888473.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月28日 13:56:57
下一篇 2025年11月28日 14:02:08

相关推荐

  • XPath的remove()函数如何删除项?

    答案是XPath不提供删除功能,仅用于节点定位,删除需依赖宿主语言或工具实现。具体过程为:先用XPath表达式精准选择目标节点,再通过JavaScript的remove()、Python lxml库的remove()或XSLT转换等外部方法完成删除操作。这种设计体现了查询与操作的职责分离,确保XPa…

    2025年12月17日
    000
  • XPath的name()函数如何获取节点名称?

    name()函数返回节点的完整名称(含命名空间前缀),而local-name()仅返回本地名称。例如,name(//prefix:element)返回”prefix:element”,local-name()返回”element”。在无命名空间时二者结…

    2025年12月17日
    000
  • XPath的xml-version()函数返回什么?

    xml-version()函数返回当前XML文档声明的版本,若无声明则默认返回“1.0”;该函数自XPath 2.0引入,XPath 1.0不支持,其行为在XPath 2.0及以上版本中一致。 那结果自然就是“1.1”。 但这里有个小细节值得注意:如果XML文档压根就没有 这个声明, xml-ver…

    2025年12月17日
    000
  • XPath的matches()函数支持正则表达式吗?

    是的,XPath的matches()函数支持正则表达式,这是XPath 2.0及以上版本引入的功能,用于实现比contains()更灵活的模式匹配。其语法为matches(input-string, pattern, flags?),可选标志包括i(不区分大小写)、m(多行模式)等。例如//div[…

    2025年12月17日
    000
  • XPath的environment-variable()函数怎么用?

    答案:XPath的environment-variable()函数用于在XPath 3.0+中读取系统环境变量,返回字符串值或空序列,适用于动态配置、环境适配、调试控制等场景,使用时需注意变量缺失、安全性、平台差异和执行环境限制,并可通过exists()判断或提供默认值来优雅处理空值。 XPath的…

    2025年12月17日
    000
  • XML的XSL-FO技术现在还常用吗?怎么解析这类文档?

    XSL-FO虽非主流但仍不可替代,它专精于高精度、自动化文档生成,在银行账单、法律文件等复杂打印场景中优势显著;其核心价值在于精确控制版式与打印质量,通过XSLT将XML数据转为XSL-FO指令,再经处理器(如Apache FOP、RenderX XEP)渲染为PDF等格式;相比HTML+CSS或M…

    2025年12月17日
    000
  • XPath的lower-case()函数如何转换小写?

    lower-case()函数用于将字符串转为小写,语法为lower-case(string),支持非字符串参数的自动转换,适用于不区分大小写的匹配、数据标准化等场景,如//item/name/lower-case(.)返回小写名称,结合contains()可实现忽略大小写的搜索,空节点返回空字符串,…

    2025年12月17日
    000
  • XPath的ancestor轴如何选择祖先节点?

    ancestor轴用于向上追溯当前节点的所有祖先,从父节点直至根节点,支持通过节点类型和谓词条件(如属性、位置、内容)精准筛选目标祖先,常用于网页抓取中定位稳定容器、提取上下文信息或处理嵌套不规则的DOM结构。 XPath的 ancestor 轴,说白了,就是用来选定当前节点所有祖先的。它会从当前节…

    2025年12月17日
    000
  • XPath的text()函数的作用是什么?如何使用?

    XPath的text()函数用于提取节点的文本内容,不包含标签或属性。1. 基本用法:通过/book/title/text()可提取指定节点的文本,如获取书名“The Lord of the Rings”。2. 提取所有文本:使用/book//text()可获取book下所有后代文本节点,返回包含书…

    2025年12月17日
    000
  • XPath的index-of()函数怎么查找位置?

    index-of()函数用于查找值在序列中首次出现的位置,从1开始计数,未找到则返回空序列,该函数属于XPath 2.0及以上版本,XPath 1.0需通过count和preceding-sibling等方法模拟实现,且处理节点等复杂类型时需转换为字符串比较。 XPath的 index-of() 函…

    2025年12月17日
    000
  • XPath的preceding轴怎么选择之前的节点?

    XPath的preceding轴选择当前节点前所有节点并逆序排列,可用于筛选特定类型或属性的前置节点,区别于仅选兄弟节点的preceding-sibling轴,适用于日志分析等场景,使用时需注意性能影响,XPath 2.0提供更强过滤能力。 XPath 的 preceding 轴用于选择当前节点之前…

    2025年12月17日
    000
  • XPath的boolean()函数如何转换值为布尔型?

    boolean()函数将XPath值按规则转为布尔值:数字中0和NaN为false,其余为true;空字符串为false,非空为true;节点集非空为true;布尔值不变。可用于条件判断,如//item[@price and boolean(@price)]选price非空节点。与string()、…

    2025年12月17日
    000
  • XPath的system-property()函数获取什么信息?

    system-property()函数用于获取XSLT处理器的版本、供应商及网址信息,通过xsl:version、xsl:vendor和xsl:vendor-url三个标准属性实现,帮助解决版本兼容性问题和调试环境差异,提升样式表的可移植性与健壮性。 XPath的system-property() …

    2025年12月17日
    000
  • XPath的parent轴和../有什么区别?

    parent轴和../是XPath中选择父节点的等价方式,前者为完整语法,后者为简写形式,效果完全相同,常用于简化表达式或提高可读性。 XPath 中 parent 轴和 ../ 实际上是同一件事,它们都用于选择当前节点的父节点。简单来说,它们是同义词,效果完全一样。 XPath 中, parent…

    2025年12月17日
    000
  • XPath的运算符需要转义吗?

    <blockquote>XPath运算符无需转义,直接使用+、-、*、=、and、or等;但在XML属性中需对、&等字符进行XML实体转义,如、…

    好文分享 2025年12月17日
    000
  • XPath的generate-id()函数有什么用?

    generate-id()函数在XPath中为节点生成会话内唯一标识符,用于在缺乏id属性时区分相同标签的节点实例。它在XSLT中常用于创建唯一HTML id实现锚点链接,或配合xsl:key进行基于节点身份的索引,如处理重复名称的产品节点时确保链接精准定位。该标识符仅在当前处理会话中稳定且唯一,不…

    2025年12月17日
    000
  • XPath的zero-or-one()函数怎么用?

    zero-or-one()函数确保序列为空或仅含一项,若超过一项则抛出错误,适用于强制唯一性约束场景。 XPath的 zero-or-one() 函数是一个用于序列类型检查的强大工具,它的核心作用是确保一个表达式返回的序列中,要么不包含任何项(空序列),要么只包含一个项。如果实际返回的项超过一个,它…

    2025年12月17日
    000
  • XPath的id()函数怎么通过ID选择元素?

    id()函数可高效定位带唯一ID的元素,语法为id(‘ID值’),如id(‘submit-button’)直接选中对应元素;相比//[@id=”],id()利用文档索引更快,且XPath 2.0+支持多ID查询如id(‘a b …

    2025年12月17日
    000
  • XPath的following轴怎么选择之后的节点?

    xpath的following轴用于选择当前节点之后的所有非祖先、非属性、非命名空间节点,按文档顺序排列,可通过following::node()选择所有后续节点,或使用following::p、following::a[@href]、following::div[contains(@class,&…

    2025年12月17日
    000
  • XPath的not()函数怎么否定表达式?

    not()函数用于反转XPath表达式的布尔结果,常用于筛选不满足特定条件的节点。其基本形式为not(expression),可否定属性存在、属性值、文本内容或子元素存在性。常见用法包括//div[not(@class)]选择无class属性的div,//a[not(@target=’_…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信