Nodal

Nodal 是一个 Swift 库,用于使用类似 DOM 的树来处理 XML 文档。 它提供了将 XML 解析为树结构、操作树以及从树生成 XML 的工具。 该库轻量、高效,并与 Linux、Windows 和所有 Apple 平台兼容。

Nodal 基于 pugixml,并添加了一个方便的 Swift 层以及对 XML 命名空间的支持。 整个公共 API 都有 DocC 文档。

Swift Platforms

安装

将 Nodal 添加为 Package.swift 中的依赖项

dependencies: [
    .package(url: "https://github.com/tomasf/Nodal.git", .upToNextMinor(from: "0.2.0"))
]

然后,将 Nodal 包含在目标依赖项中,并确保启用 C++ 互操作性

.target(
    name: "YourTargetName",
    dependencies: ["Nodal"],
    swiftSettings: [.interoperabilityMode(.Cxx)] // Nodal requires C++ interop
)

用法

let document = Document()
let root = document.makeDocumentElement(name: "content", defaultNamespace: "http://tomasf.se/xml/example")
let entry = root.addElement("entry")
entry[attribute: "key"] = "price"
entry.addText("499")
let output = try document.xmlData()

节点

Nodal 将 XML 文档表示为 DOM(文档对象模型),这是一个节点树。 树中的每个节点代表 XML 文档的元素、文本、注释或其他结构组件。

节点与其所属的树紧密绑定。 节点不能脱离文档存在;您不能创建一个独立的节点,然后稍后添加它。 相反,您可以直接创建新节点作为现有父节点的子节点。 删除节点后,它会立即失效,并且无法重用或重新添加到其他地方。 但是,可以将节点移动到同一文档中的新位置。

与元素不同,Nodal 中的属性不表示为节点。 相反,直接在元素上访问和操作属性。 您可以通过它们的名称(限定名称或展开名称)来检索和设置属性的值。

命名空间

Nodal 支持元素和属性的命名空间。 这意味着您可以将展开名称(命名空间 URI + 本地名称)分配给它们,并且将为您设置相应的限定名称。

element.addElement("weight", namespace: "http://tomasf.se/xml/example")

这假定命名空间已在该元素或其祖先之一中声明并分配了前缀。 如果没有,Nodal 将使用临时限定名称,并在您声明命名空间后填充最终名称。 尝试为具有未解析命名空间的文档生成 XML 会引发错误。

root.declareNamespace("http://tomasf.se/xml/example", forPrefix: "ex")

如果您希望在没有命名空间的情况下工作,那也没问题。

XPath

XPath 是一种用于查询和从 XML 文档中选择节点的语言。 它允许您编写表达式以有效地定位元素和属性。

使用示例

let document = try Document(string: """
<catalog>
  <book id="bk101">
    <title>XML Developer's Guide</title>
  </book>
  <book id="bk102">
    <title>Midnight Rain</title>
  </book>
</catalog>
""")

if let name = query.firstNodeResult(with: document)?.node?.textContent {
    print("Book name:", name) // Outputs "XML Developer's Guide"
}

虽然 Nodal 在使用 DOM 时支持 XML 命名空间,但其 XPath 实现不支持命名空间。 此限制来自 pugixml。 要在文档中使用命名空间的元素和属性,您必须在 XPath 表达式中使用它们的限定名称。

贡献

欢迎贡献! 如果您有想法、建议或改进,请随时打开一个 issue 或提交一个 pull request。

许可

本项目基于 MIT 许可证授权,pugixml 也是如此。 有关详细信息,请参阅各自的 LICENSE 文件。