SwiftXMLParser

关于本库

这是一个非验证型的 XML 解析器,用于解析 UTF-8 编码的 XML 文件。

本库以 Apache License 2.0 许可证发布,请随意使用和修改。欢迎任何意见、建议或 Pull Request,您也可以在我的网站上找到我的联系方式。

重要提示

此解析器的主要方面

对于那些根据文档内部子集不被视为外部实体的实体(在此处被称为“内部”实体),客户端可以进行替换。属性值中的内部实体必须由客户端替换,而文本中的内部实体则可能保留。客户端可以通过在解析调用中添加尾随闭包来处理实体。该闭包会接收实体名称,以及元素和属性的可选名称(如果实体来自属性值)。

除了实体处理之外,客户端通过 “XMLEventHandler” 类型的实例来使用解析器,该类型在 (XMLInterfaces)[https://github.com/stefanspringer1/XMLInterfaces] 仓库中定义。

此解析器的一些限制

文档

将添加更多文档(如果活跃的代码仓库尚未迁移,请参见上面),或者在此 README 文件中,或者作为代码注释。

测试工具

对于解析器的测试,可能需要使用以下函数之一。它们会打印解析器事件以及根据报告的二进制和文本位置进行的提取

func xParseTest(forData: Data, writer: XTestWriter, fullDebugOutput: Bool)
func xParseTest(forPath: String, writer: XTestWriter, fullDebugOutput: Bool) throws
func xParseTest(forText: String, writer: XTestWriter, fullDebugOutput: Bool)
func xParseTest(forURL: URL, writer: XTestWriter, fullDebugOutput: Bool) throws

示例

let source = """
<a>Hi</a>
"""

xParseTest(forText: source, fullDebugOutput: false)

输出

document started
start of element: name "a", no attributes; 1:1 - 1:3 (0..<3 in data)
  binary excerpt: {<a>}
  line excerpt:   {<a>}
text: "Hi", whitespace indicator NOT_WHITESPACE; 1:4 - 1:5 (3..<5 in data)
  binary excerpt: {Hi}
  line excerpt:   {Hi}
end of element: name "a"; 1:6 - 1:9 (5..<9 in data)
  binary excerpt: {</a>}
  line excerpt:   {</a>}
document ended

如果将 fullDebugOutput 设置为 true,则字符会与解析器的内部状态一起打印出来

document started
@ 1:1 (#0 in data): "<" in TEXT in TEXT (whitespace was: true)
@ 1:2 (#1 in data): "a" in JUST_STARTED_WITH_LESS_THAN_SIGN in TEXT (whitespace was: true)
@ 1:3 (#2 in data): ">" in START_OR_EMPTY_TAG in TEXT (whitespace was: true)
start of element: name "a", no attributes; 1:1 - 1:3 (0..<3 in data)
  binary excerpt: {<a>}
  line excerpt:   {<a>}
@ 1:4 (#3 in data): "H" in TEXT in TEXT (whitespace was: true)
@ 1:5 (#4 in data): "i" in TEXT in TEXT (whitespace was: false)
@ 1:6 (#5 in data): "<" in TEXT in TEXT (whitespace was: false)
text: "Hi", whitespace indicator NOT_WHITESPACE; 1:4 - 1:5 (3..<5 in data)
  binary excerpt: {Hi}
  line excerpt:   {Hi}
@ 1:7 (#6 in data): "/" in JUST_STARTED_WITH_LESS_THAN_SIGN in TEXT (whitespace was: true)
@ 1:8 (#7 in data): "a" in END_TAG in TEXT (whitespace was: true)
@ 1:9 (#8 in data): ">" in END_TAG in TEXT (whitespace was: true)
end of element: name "a"; 1:6 - 1:9 (5..<9 in data)
  binary excerpt: {</a>}
  line excerpt:   {</a>}
document ended

如果您想调整此测试,例如将调试输出写入其他位置,请查看 xParseTest(forData:writer:fullDebugOutput:) 的实现。