0

公平警告:我绝对不知道 Objective-C。我正在为 PyObjC 使用 Foundation 模块。

我有一本字典,我用它来创建一个NSDictionary. 一个例子:

from Foundation import NSDictionary
d = {'a': 1, 'b': 2, 'c': 3}
nsd = NSDictionary(d)

我知道我可以使用 将 的内容写入nsd文件nsd.writeToFile_atomically_(),但我不知道如何获取包含所有 plist-y XML 的字符串。你可能认为我可以使用一个StringIO对象,但是:

>>> import StringIO
>>> s = StringIO.StringIO()
>>> nsd.writeToFile_atomically_(s,True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: NSInvalidArgumentException - Class OC_PythonObject: no such selector: getFileSystemRepresentation:maxLength:

我无法对帮助页面做出正面或反面,并且我尝试过搜索 SO 和整个网络,人们似乎对做与我想做的相反的事情更感兴趣。

我想要的是能够做这样的事情:

plst = nsd.asPlistyString_()

或者也许我必须使用一个NSSString,我不知道:

plst = NSString.makePlistyStringFromDictionary_(nsd)

无论哪种方式,plst都会像"<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC"yada yada。有人可以指出我正确的方向吗?

编辑:我知道,plistlib但我正在尝试直接与 Foundation 一起执行此操作,以帮助我的代码与未来兼容。(plistlib虽然很不错。)

4

2 回答 2

3

虽然这不能直接回答您的问题,但您可以使用标准库模块更轻松地做到这一点plistlib

import plistlib
d = {'a': 1, 'b': 2, 'c': 3}
plist_string = plistlib.writePlistToString(d)

结果:

<?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>a</key>
    <integer>1</integer>
    <key>b</key>
    <integer>2</integer>
    <key>c</key>
    <integer>3</integer>
</dict>
</plist>
于 2013-07-13T03:56:39.080 回答
1

像这样的东西应该适合你。您基本上需要使用 NSPropertyListSerialization 将字典序列化为 xml。

from Foundation import NSDictionary, NSString, NSPropertyListSerialization
from Foundation import NSUTF8StringEncoding, NSPropertyListXMLFormat_v1_0

d = {'a': 1, 'b': 2, 'c': 3}
nsd = NSDictionary(d)

# serialize the dictionary as XML into an NSData object
xml_plist_data, error = NSPropertyListSerialization.dataWithPropertyList_format_options_error_(nsd, NSPropertyListXMLFormat_v1_0, 0, None)

if xml_plist_data:
    # convert that data to a string
    xml_plist = NSString.alloc().initWithData_encoding_(xml_plist_data, NSUTF8StringEncoding)
else:
    # look at the error
    pass
于 2013-07-13T03:34:56.127 回答