MST
星途 面试题库

面试题:Swift 中处理 XML 时,如何实现深度优先遍历 XML 节点并处理节点数据

给定一个 XML 字符串:<root><child1><subchild1>value1</subchild1></child1><child2><subchild2>value2</subchild2></child2></root>,使用 Swift 编写代码实现深度优先遍历 XML 节点,在遍历到每个节点时,打印出节点名称以及节点内的文本值(如果有)。
46.1万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试
import Foundation

func dfsTraverse(_ xmlString: String) {
    guard let xmlData = xmlString.data(using:.utf8),
          let xmlDoc = try? AEXMLDocument(xmlData: xmlData) else {
        return
    }
    
    func traverse(_ node: AEXMLNode) {
        print("Node Name: \(node.name), Text: \(node.value ?? "")")
        for child in node.children {
            traverse(child)
        }
    }
    
    traverse(xmlDoc.root)
}

let xmlString = "<root><child1><subchild1>value1</subchild1></child1><child2><subchild2>value2</subchild2></child2></root>"
dfsTraverse(xmlString)

这里使用了 AEXML 库来解析 XML,首先将 XML 字符串转换为 Data 类型,然后创建 AEXMLDocument。接着通过递归的方式实现深度优先遍历,在遍历每个节点时打印节点名称和节点内的文本值。要使用这个代码,需要在项目中导入 AEXML 库,可以通过 CocoaPods 或 Swift Package Manager 来导入。

如果不想使用第三方库,也可以自己实现 XML 解析逻辑,但这会更复杂,这里给出简单示例:

func parseXML(_ xml: String) {
    var index = xml.startIndex
    func dfs() {
        guard index < xml.endIndex else { return }
        let startTagIndex = xml.index(index, offsetBy: 1)
        let endTagIndex = xml.firstIndex(of: ">", after: startTagIndex)!
        let tag = String(xml[startTagIndex..<endTagIndex])
        print("Node Name: \(tag), ", terminator: "")
        index = xml.index(after: endTagIndex)
        if xml[index] == "<" {
            if xml[index.advanced(by: 1)] != "/" {
                dfs()
            }
        } else {
            let textEndIndex = xml.firstIndex(of: "<", after: index)!
            let text = String(xml[index..<textEndIndex])
            print("Text: \(text)")
            index = textEndIndex
        }
        if xml[index.advanced(by: 1)] == "/" {
            index = xml.index(index, offsetBy: 2 + tag.count)
        } else {
            dfs()
        }
    }
    dfs()
}

let xmlString = "<root><child1><subchild1>value1</subchild1></child1><child2><subchild2>value2</subchild2></child2></root>"
parseXML(xmlString)

这种方法是直接在字符串上进行操作,通过查找 <> 来确定标签和文本的位置,实现深度优先遍历。但实际应用中,对于复杂的 XML 结构,使用成熟的 XML 解析库会更加可靠和高效。