Nodal 是一个 Swift 库,用于使用类似 DOM 的树来处理 XML 文档。 它提供了将 XML 解析为树结构、操作树以及从树生成 XML 的工具。 该库轻量、高效,并与 Linux、Windows 和所有 Apple 平台兼容。
Nodal 基于 pugixml,并添加了一个方便的 Swift 层以及对 XML 命名空间的支持。 整个公共 API 都有 DocC 文档。
将 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 是一种用于查询和从 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 文件。