有没有办法在使用Swift中的XMLParser处理文档时扩展XML实体?我没有在API中看到任何内容,但我发现很难相信这是一个奇特的要求。
如果直接从Swift使用libxml2 API,则可以通过字符回调提供扩展实体,就好像它是内联的一样。
这是我的示例代码:
let xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<!DOCTYPE simple [" +
"<!ENTITY e \"entity\">" +
"]>" +
"<root><val>&e;</val></root>"
class ParserDelegate : NSObject, XMLParserDelegate {
var entities = [String:String?]()
var text: String?
func parser(_ parser: XMLParser, foundInternalEntityDeclarationWithName name: String, value: String?) {
self.entities[name] = value
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
text = text == nil ? string : self.text! + string
}
}
let delegate = ParserDelegate()
let parser = XMLParser(data: xml.data(using: String.Encoding.utf8)!)
parser.delegate = delegate
parser.parse()
if let text = delegate.text {
print("found text:" + text)
}
delegate.entities.forEach() {
(entry) in let (key, val) = entry
print(key + ": " + (val ?? "<nil>"))
}
运行此命令时,永远不会打印“找到的文本”,因为永远不会调用func parser(_ parser: XMLParser, foundCharacters string: String)
,因为可以通过设置断点来验证。
输出只是:
e: entity
我已尝试查看委托上的各种方法但我没有看到任何相关内容。 public func parser(_ parser: XMLParser, resolveExternalEntityName name: String, systemID: String?) -> Data?
方法看起来很接近,但这些是内部实体,实现它不会产生有趣的结果。
修改的
看起来这对解析器来说确实是一个限制,可以追溯到很多年。
我可以在stackoverflow上找到回到2009年的问题:
我在2017年5月的Open Radar上找到了这个项目:
libxml2库中有一些commentary on entities表示实体所带来的一些挑战,这可能有助于解释为什么(NS)XMLParser的行为。