Swift XML解析器随机删除空格

时间:2014-12-06 17:35:47

标签: xml parsing swift xml-parsing

我正在使用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)

感谢您的帮助!

3 个答案:

答案 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)