【问题标题】:Encoding Line Feed Characters in the value of a NSXMLElement's attribute在 NSXMLElement 的属性值中编码换行符
【发布时间】:2012-04-25 10:51:58
【问题描述】:

我正在读取和写入的 XML 数据库的注释字段存储为 NSXMLElement 的属性。一个条目包含换行符 (0x0a) 字符。这些由我解析为
 的文档中的非 NSXML 编码器编码,并由 NSXML 正确解析。它们导致 NSString 在内存中包含 unicode 值 0x0a 0x00(intel 字节排序)。

例如:

<INFO BITRATE="192000" GENRE="Podcast" COMMENT="Test &amp; More Test &#xA;&#xA;After the Line Feeds"</INFO>

当将此 NSString 作为 NSXMLElement 属性的值写回时,它不会被编码回并导致以下内容输出到 xml 文件:

 <INFO BITRATE="192000" GENRE="Podcast" COMMENT="Test &amp; More Test 

After the Line Feeds"</INFO>

在重新读取文件时当然不会正确解析。

似乎NSXMLNodePreserveCharacterReferencesNSXMLNodePreserveEntities 之类的节点选项应该是可行的方法,但它似乎没有任何帮助。

我一定错过了显而易见的事情,但我整天都被困在这个问题上。

【问题讨论】:

  • 您在阅读或写作时使用了这些选项吗?
  • 一开始我没有任何选择(除了写作时在整个文档上使用 NSXMLNodePrettyPrint)。
  • 我在整个文档上有NSXMLNodePrettyPrint,在写的时候在cmets属性节点上有NSXMLNodePreserveCharacterReferences | NSXMLNodePreserveEntities。阅读时我没有任何选择。只需在节点上使用[[anElement attributeForName:@"Comments"] stringValue]
  • Preserve 选项仅在读取/解析 XML 时有用。这是在文档中。查找NSXMLNodePreserveCharacterReferences 并向下滚动到讨论部分。您的另一个选择是使用标准的NSString 方法自己进行替换,然后使用-setStringValue:resolvingEntities: 将其设置在NSXMLNode 上,传递NO
  • 我会试试的,谢谢。奇怪的是它与它的读/写行为不一致(即它转换 颠覆阅读但在写入时不将其转换回来)。

标签: xml cocoa nsxmlparser nsxmldocument nsxmlelement


【解决方案1】:

苹果说:

名称中带有“Preserve”的选项仅在解析外部 XML 源时适用;它们对以编程方式创建的节点对象没有影响。其他选项用于 NSXMLDocument 的初始化和输出方法;有关详细信息,请参阅 NSXMLDocument 参考文档。 它对我不起作用,我认为这是一个错误。

我用 KissXML 解决了这个问题。

【讨论】:

    【解决方案2】:

    与 Apple 核实,这是 NSXMLDocument 的一个已知问题,现已作为错误报告提交。

    建议的解决方法包括暂时使用 libxml2。

    如果我在未来的版本中看到此问题已修复,我会发表评论。

    【讨论】:

    • 供将来参考,苹果目前正在跟踪此为 rdar://problem/7388696
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 2019-06-11
    • 2012-05-17
    • 2011-12-03
    相关资源
    最近更新 更多