【问题标题】:Swift XML parser randomly remove white spacesSwift XML 解析器随机删除空格
【发布时间】:2015-02-04 17:15:44
【问题描述】:

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

请注意,第一个 à 之前的空白消失了,但其他的没有。

我用我的编辑器用搜索替换删除了所有&lt;oVar&gt;,不需要这些,懒得尝试用代码来做。

我正在使用 AEXML 进行解析:https://github.com/tadija/AEXML

这是我的代码,除了获取字符串并打印它之外什么都不做:

if sense["dictScrap"].count > 0 {
    senseEntity.value = sense["dictScrap"].value
}

println(senseEntity.value)

感谢您的帮助!

【问题讨论】:

  • 您能否提供一个(最小的)自包含代码示例(和 XML)来演示该问题?
  • 一些 XML 解析器确实删除了元素上下文中的 "空格*(如果他们认为它不是文档上下文中有意义的部分,有时会被错误地称为“可忽略的空格”。还有XML 解析器将规范化空白的地方。*HOWEVER,这显然发生在 标记的处理中,即 not 由解析器完成,但由应用程序代码完成;找到该代码并修复错误。

标签: xml parsing swift xml-parsing


【解决方案1】:

我用你的例子做了一些测试,你提供的修复是正确的。

这是因为NSXMLParser 行为我显然没有遇到 在创建 AEXML 时使用我的 XML 数据(没有像 'à' 这样的字符,这会导致 parser(_:foundCharacters:) 被多次调用)。

因此,此修复程序现在包含在 AEXML 中,感谢您的反馈!

【讨论】:

【解决方案2】:

所以我查看了 AEXML 源代码,发现这个函数是导致问题的原因:

func parser(parser: NSXMLParser, foundCharacters string: String) {
    currentValue += string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    currentElement?.value = currentValue
}

当我删除 .stringByTramming... 时,空格不再被删除。

如果我在解析后的值上使用.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()),最终的字符串看起来就像我想要的那样。

谢谢大家!

【讨论】:

    【解决方案3】:

    我在使用最新版本的库时遇到了类似的问题。为我解决问题的是创建 AEXMLDocument 并将 shouldTrimWhitespace 选项设置为 false:

    var options = AEXMLOptions()
    options.parserSettings.shouldTrimWhitespace = false
    let xml = try? AEXMLDocument(xml: response, options: options)
    

    【讨论】:

      猜你喜欢
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多