面试题答案
一键面试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 解析库会更加可靠和高效。