Swift 使用 Foundation 框架中的 XMLParser 类解析服务器返回的 XML 数据,1. 通过 URLSession 获取 XML 数据并转换为 Data 对象,2. 利用 XMLParser 初始化并设置代理,3. 在代理方法中处理元素开始、字符内容和元素结束事件,4. 累积文本内容以避免分段丢失,最终完成书籍信息解析。

Swift 本身没有内置的 XML 解析器,但可以借助 Foundation 框架中的 XMLParser 类来原生解析服务器返回的 XML 数据流。这个类是基于事件驱动的 SAX 风格解析器,适合处理大文件或网络流数据,内存占用低。
从服务器获取 XML 后,通常以 Data 形式存在。你可以用 Data 初始化 XMLParser,并通过代理方法逐步解析内容。
示例:请求 XML 并解析
以下是一个完整的流程:发送网络请求 → 获取 XML 数据 → 使用 XMLParser 解析。
import Foundation
// 定义模型存储解析结果
struct Book {
    var title: String = ""
    var author: String = ""
}
class XMLHandler: NSObject, XMLParserDelegate {
    private var books = [Book]()
    private var currentElement = ""
    private var currentTitle = ""
    private var currentAuthor = ""
    func parseXML(from data: Data) {
        let parser = XMLParser(data: data)
        parser.delegate = self
        if parser.parse() {
            print("解析完成,共 \(books.count) 本书")
            for book in books {
                print("书名:\(book.title),作者:\(book.author)")
            }
        } else {
            print("解析失败,错误:\(parser.parserError?.localizedDescription ?? "未知错误")")
        }
    }
    // 开始解析元素
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        currentElement = elementName
    }
    // 处理字符内容
    func parser(_ parser: XMLParser, foundCharacters string: String) {
        let data = string.trimmingCharacters(in: .whitespacesAndNewlines)
        if !data.isEmpty {
            switch currentElement {
            case "title":
                currentTitle += data
            case "author":
                currentAuthor += data
            default:
                break
            }
        }
    }
    // 结束元素,保存对象
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        if elementName == "book" {
            let book = Book(title: currentTitle, author: currentAuthor)
            books.append(book)
            currentTitle = ""
            currentAuthor = ""
        }
    }
}使用 URLSession 获取服务器返回的 XML 数据:
func fetchAndParseXML() {
    guard let url = URL(string: "https://example.com/books.xml") else { return }
    URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            print("网络错误:\(error.localizedDescription)")
            return
        }
        guard let data = data else {
            print("无数据返回")
            return
        }
        let handler = XMLHandler()
        handler.parseXML(from: data)
    }.resume()
}XMLParser 是逐行解析的,不会一次性加载整个文档到内存,因此非常适合处理大型 XML 流。你需要关注以下几个代理方法:
⚠️ 注意:foundCharacters 可能被多次调用(如文本过长时),所以建议使用字符串拼接而不是直接赋值。
假设服务器返回如下 XML:
```xml上述代码将正确解析出两本书的信息。
基本上就这些。使用 Swift + Foundation 的 XMLParser 能高效、原生地处理 XML 数据流,无需第三方库,适合大多数简单到中等复杂度的 XML 解析场景。
以上就是Swift语言怎么解析服务器返回的XML_Swift原生解析XML数据流方法的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号