使用XMLParser在Swift中使用实体解析XML

时间:2017-06-21 15:44:59

标签: xml swift swift3 xml-parsing

有没有办法在使用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的行为。

0 个答案:

没有答案