【问题标题】:xpath is inspecting DOM or XML?xpath 正在检查 DOM 还是 XML?
【发布时间】:2023-03-03 12:29:01
【问题描述】:

我对 xpath、DOM 和实际的 XML 有点困惑。

来自 w3.org

XPath 是一种用于寻址 XML 文档部分的语言

来自 w3schools

XPath 用于浏览 XML 中的元素和属性 文件。

这一切看起来都很好。然而,在 xpath 中有 text() 节点和文本节点是 DOM 协议的一部分。那么 xpath 是否真的在检查 DOM?

【问题讨论】:

标签: xml dom xpath protocols


【解决方案1】:

XPath 和DOM 都是处理XML 文档结构 的两种方式。 W3C 已将这种结构形式化为 XML Infoset 名称,表示 XML 文档包含的信息,与该文档当前的表示方式无关。

XML 及其所有 <> 是用于传输的信息集的主要表示形式,尽管其他形式是可能的(例如快速信息集)。但是在处理一个XML文档的过程中,你并不关心<出现了多少次,你感兴趣的是标记所代表的结构。

XPath 和 DOM 都包含它们自己的 XML 文档模型,该模型超越了 Infoset(以一种仔细指定的方式),为遍历和操作文档提供更高级别的抽象。 DOM 的“文本节点”类型和 XPath 的text() 节点测试的相似之处仅仅是因为在处理 XML 文档时这是一个有用的抽象。 Infoset 将每个字符视为一个不同的“字符信息项”,但几乎每个处理器都希望将连续字符组合成一个字符串。

DOM 将其模型定义为一系列具有严格定义接口的对象,用于面向对象编程;它实际上在某种程度上独立于 XML 和 XML Infoset,它的起源和当前的开发重点都是作为与用 HTML 编写的 Web 文档交互的模型。 XPath 使用的模型现在已拆分为自己的规范,XQuery and XPath Data Model;它是根据 XML 信息集显式构建的,以允许结构化查询。

【讨论】:

    【解决方案2】:

    XPath 定义了一个数据模型,它是 XML 的树表示,并且 XPath 表达式的语义是相对于这个数据模型定义的。在 XPath 1.0 中,模型是 XPath 规范的一部分;在 2.0 中,它是一个单独的规范,称为 XDM。它类似于 DOM,但又不完全相同;例如,在 DOM 中,命名空间可作为属性节点访问,但在 XDM 中,它们由命名空间节点表示。 DOM 允许您表示不对应于任何 XML 文档的事物(例如,未绑定到任何命名空间 URI 的名称中的命名空间前缀),但 XDM 更严格。

    许多 XPath 实现适用于树模型,例如 DOM、JDOM 或 XOM,它们与 XDM 在细微的细节上有所不同。这样的实现实际上必须弄清楚当它遇到 XDM 不允许的东西时该怎么做:例如,当它遇到具有相邻或零长度文本节点的 DOM 时应该发生什么。

    所以你是对的,XPath 语义是针对树的导航定义的,但是树虽然类似于 DOM,但实际上并不是 DOM。

    【讨论】:

      【解决方案3】:

      当您说“实际的 XML”时,您是指字符序列,而不是字符序列解析后内存中的树结构吗?

      XPath 对已解析的 XML(或 HTML)文档的树结构进行操作。这就是您引用的句子所指的“XML 文档”。

      DOM(文档对象模型)是一种树形结构,用于表示内存中已解析的 XML 文档的结构。所以是的,XPath 在 DOM 上运行。 XPath 不对未解析的字符序列进行操作。

      Firebug 中的 HTML 选项卡将 DOM 显示为可折叠的树结构。

      【讨论】:

      • 在 Firebug 上有 HTML 标签。即解析后的 XML 文档。但是它不是 DOM。
      • @Pithikos:你为什么说 HTML 标签显示的不是 DOM?
      • 因为它不会将标签节点与文本节点分开。它将它们显示为一件事。
      • @Pithikos:DOM 是内存中的一个结构,通过 API 访问。因此,它是不可见的。 Firebug 中的显示是 DOM 中内容的屏幕表示,旨在紧凑且对开发人员有用。我认为“标签节点”是指元素节点。
      • @LarsH 实际上,DOM API;内存中结构的实际表示完全取决于实现。这使它更加隐形。它也比普通的树结构更基于属性和方法,所以从这个意义上说,像 Firebug 这样的 HTML 浏览器不同于 DOM 可能是正确的。
      猜你喜欢
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2011-07-08
      • 2012-02-23
      • 1970-01-01
      • 2018-08-22
      相关资源
      最近更新 更多