我正在使用Swift中的法语文本解析一个大的XML文件,当我从中检索节点值时,会随机删除一些空格。
这是文件(开源,超过5mb):https://svn.code.sf.net/p/javacrim/code/littre/xml/a.xml
随机地,在强调字符之前删除空格。 例如,这是XML中的一行:
<dictScrap>Entre un substantif et un verbe. L'exhortation <oVar>à</oVar> combattre. L'encouragement <oVar>à</oVar> bien vivre. La disposition <oVar>à</oVar> plaisanter. La promptitude <oVar>à</oVar> faire. L'habileté <oVar>à</oVar> parler. La facilité <oVar>à</oVar> comprendre. La répugnance <oVar>à</oVar> venir. Le plaisir <oVar>à</oVar> obéir. La fermeté <oVar>à</oVar> soutenir la vérité. La honte <oVar>à</oVar> mentir.</dictScrap>
这是解析之后的一行:
Optional("Entre un substantif et un verbe. L\'exhortationà combattre. L\'encouragement à bien vivre. La disposition à plaisanter. La promptitude à faire. L\'habileté à parler. La facilité à comprendre. La répugnance à venir. Le plaisir à obéir. La fermeté à soutenir la vérité. La honte à mentir.")
请注意,第一个à之前的空格消失了,而其他空格则没有消失。
我使用我的编辑器删除了所有带有search-replace的<oVar>
,不需要那些并且懒得尝试用代码执行。
我正在使用AEXML进行解析:https://github.com/tadija/AEXML
这是我的代码,除了接受字符串并打印它之外什么都不做:
if sense["dictScrap"].count > 0 {
senseEntity.value = sense["dictScrap"].value
}
println(senseEntity.value)
感谢您的帮助!
答案 0 :(得分:2)
我使用您的示例进行了一些测试,并且您使用提供的修复是正确的。
这是因为我明显没有遇到的NSXMLParser
行为
在创建AEXML时使用我的XML数据(没有像'à'这样的字符,这会导致多次调用parser(_:foundCharacters:)
。
所以,这个修复现在包含在AEXML中,感谢您的反馈!
答案 1 :(得分:1)
所以我查看了AEXML源代码,发现这个函数负责这个问题:
func parser(parser: NSXMLParser, foundCharacters string: String) {
currentValue += string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
currentElement?.value = currentValue
}
当我删除.stringByTramming...
时,不再删除空格。
如果我对解析后的值使用.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
,那么最终的字符串看起来就像我想要的那样。
全部谢谢!
答案 2 :(得分:1)
我对该库的最新版本有类似的问题。解决这个问题的原因是创建了一个将shouldTrimWhitespace选项设置为false的AEXMLDocument:
var options = AEXMLOptions()
options.parserSettings.shouldTrimWhitespace = false
let xml = try? AEXMLDocument(xml: response, options: options)