Swift中处理XML时replacingOccurrences代码应置于何处?
嘿,我来帮你捋清楚这个问题!你想用replacingOccurrences把逗号分隔的食材列表换成换行展示,但没找对在XML解析流程里的位置对吧?核心问题在于:你得等完整的食材字符串被解析出来之后,再执行替换操作,而不是在解析的中间步骤(比如分段获取字符的时候)就动手。
我给你分两种常见的XML解析场景来说明:
场景1:用系统自带的NSXMLParser(代理模式)
如果你用的是苹果原生的NSXMLParser,那得注意它的foundCharacters方法可能会多次调用,每次只返回一段字符串,所以不能在这个方法里直接替换。正确的流程应该是这样:
- 先在你的解析类里声明几个临时变量,用来跟踪当前解析的元素和食材内容:
var currentElement: String? // 记录当前正在解析的XML标签 var tempIngredients: String? // 临时存储正在拼接的食材字符串 var finalIngredients: String = "" // 最终完整的食材字符串
- 在解析开始某个元素时初始化临时变量:
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { currentElement = elementName // 假设你的食材标签是<ingredients>,这里替换成你实际的标签名 if elementName == "ingredients" { tempIngredients = "" } }
- 在获取字符时,把分段的内容拼接到临时变量里:
func parser(_ parser: XMLParser, foundCharacters string: String) { guard let currentElem = currentElement, currentElem == "ingredients", var temp = tempIngredients else { return } // 先去掉字符串里的多余空格和换行,避免拼接出无效内容 temp += string.trimmingCharacters(in: .whitespacesAndNewlines) tempIngredients = temp }
- 关键步骤:在解析完食材标签的结束标签时,执行替换!
这时候你已经拿到了完整的食材字符串,替换操作就会生效:
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { if elementName == "ingredients" { if let fullIngredients = tempIngredients { finalIngredients = fullIngredients // 在这里执行你的替换逻辑! let formattedIngredients = finalIngredients.replacingOccurrences(of: ", ", with: "\n") // 接下来就可以把formattedIngredients用在UI展示上了,比如赋值给标签 yourIngredientsLabel.text = formattedIngredients } tempIngredients = nil } currentElement = nil }
场景2:用第三方XML解析库(比如XMLMapper、SwiftyXMLParser)
如果是用这类封装好的库,一般会直接把XML映射成模型对象。那你只需要在模型解析完成后,拿到食材字符串再做替换就行:
// 假设你已经解析出了菜品模型dishModel,里面有ingredients属性 if let rawIngredients = dishModel.ingredients { let formattedIngredients = rawIngredients.replacingOccurrences(of: ", ", with: "\n") // 展示格式化后的内容 }
为什么你之前尝试没成功?
很大概率是你在foundCharacters方法里就执行了替换——这个方法会多次触发,每次只返回一部分字符串,导致替换只作用在分段内容上,最终结果自然不对。或者是在还没等食材标签解析完成时就执行了替换,拿到的是不完整的字符串。
最后提醒下:要确认XML里的食材分隔符确实是", "(逗号加空格),如果XML里只有逗号没有空格,记得把of:参数改成","哦!
内容的提问来源于stack exchange,提问作者miranda
相关产品推荐
相关产品推荐

