Swift Xcode 下XML字符串提取指定节点值到String数组的性能问题求解
问题原因
你现有的实现性能差是核心逻辑的时间复杂度太高:每次循环都需要对剩余的整段XML字符串执行多次查找、截取操作,数据量达到千级以上时会产生大量重复计算,时间复杂度达到O(n²)级别,自然会卡顿。
正确实现方案
用系统自带的XMLParser做事件驱动的SAX解析即可,只遍历XML一次,时间复杂度为O(n),万级数据也能毫秒级完成解析。以下是直接可以替换你原有方法的实现,不需要修改外部调用逻辑:
import Foundation // 专用代理类,用来收集目标节点的内容 private class NodeValueCollector: NSObject, XMLParserDelegate { let targetNode: String private(set) var result: [String] = [] private var currentContent = "" private var isInsideTargetNode = false init(targetNode: String) { self.targetNode = targetNode super.init() } func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { isInsideTargetNode = (elementName == targetNode) if isInsideTargetNode { currentContent = "" } } func parser(_ parser: XMLParser, foundCharacters string: String) { if isInsideTargetNode { currentContent += string } } func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { if elementName == targetNode { result.append(currentContent.trimmingCharacters(in: .whitespacesAndNewlines)) isInsideTargetNode = false } } } public func getArrayFromXMLString(xml: String, node: String) -> [String] { guard let xmlData = xml.data(using: .utf8) else { return [] } let collector = NodeValueCollector(targetNode: node) let parser = XMLParser(data: xmlData) parser.delegate = collector parser.parse() return collector.result }
用法和你原方法完全一致,传入XML字符串和目标节点名(例如你的示例场景传project)即可得到对应内容的数组。
内容的提问来源于stack exchange,提问作者Sander Wijnen
相关产品推荐
相关产品推荐

