You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:06:05