Ruby阅读/保存plist:如何保持字符串缩进?

问题描述

我正在使用Ruby的gem plist更新plist文件,并保存其认格式后会用换行符将字符串值断开:

之前:

<dict>
    <key>message</key>
    <string>This is the first line.

this should be the second line.</string>
</dict>

之后:

<dict>
    <key>message</key>
    <string>This is the first line.

    this should be the second line.</string>
</dict>

当我在iOS应用中阅读消息时,消息显示为:

This is the first line.

this should be the second line.

但是,认格式显示为:

This is the first line.

    this should be the second line.

有没有办法保持缩进不变? (我知道plist gem可让您指定要使用的缩进(认为制表符),但它适用于使用缩进的每种情况。

谢谢!

解决方法

没有minimal reproducible example的情况下,任何人最多只能猜测你到底在做什么才能导致这个结果。

我的猜测:您必须查看how the gem works。值得注意的是,检查它如何实现IndentedString#<<

gem实现了多种“写入值”的方法,我敢打赌,无论您使用的是什么,block.call都会返回一个数组,其单个元素将为always be independently indented

尝试使用raw verbatim String values之类的其他生成方法之一来输出未缩进的值。

,

如果格式不是您的问题,您可以使用 plist_lite

例如,运行以下命令:

ruby -rplist_lite -e 'puts PlistLite.dump(PlistLite.load($stdin.read))' <<EOS
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>message</key>
    <string>This is the first line.

this should be the second line.</string>
</dict>
</plist>
EOS

输出:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>message</key><string>This is the first line.

this should be the second line.</string></dict></plist>

不像plistplist_lite的设计非常简单,没有格式化或编组等花哨的功能,只有2个API,PlistLite#loadPlistLite#dump . (界面类似于内置的 JSONYAML)。

plist_liteplist 快 5 倍以上,因为它是用 C 编写的。如果您了解性能,我想您可以尝试一下。