plist
1.1、plist简介

plist(Property List)

plist是一种特定格式的XML

plistmacOSiOS中最常用的格式化数据结构。

1.2、plist的格式

我们知道,XML都有一个DTD(Document Type Definition),用来说明这个XML的元素的数据类型的,plistDTD定义为:http://www.apple.com/DTDs/PropertyList-1.0.dtd

plist中支持的类型包括:

plist类型Objective-C类型Java类型JavaScript类型
dictNSDictionaryMapObject
arrayNSArrayArrayListArray
stringNSStringStringString
integerNSIntegerintNumber
realCGFloatfloat | doubleNumber
trueYEStruetrue
falseNOfalsefalse
DateNSDateDateDate
Data
1.2.1、dict

dict就是key-value对形式的数据,这种结构在不同的语言中有不同的叫法,比如: 在Objective-C中称为NSDictionary, 在Java中称为Map, 在JavaScript里就是叫做Object

dict中的key都是字符串,value可以是任意类型。

示例:

<?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>phoneNumbers</key>
	<array>
		<string>15656059398</string>
		<string>15656059399</string>
	</array>
	<key>married</key>
	<false/>
	<key>male</key>
	<true/>
	<key>birthday</key>
	<date>2000-04-22T06:23:04Z</date>
	<key>age</key>
	<integer>18</integer>
	<key>weight</key>
	<real>75.5</real>
	<key>location</key>
	<string>中国北京市朝阳区</string>
</dict>
</plist>

说明:

前面3行都是固定写法。

从第4行开始的节点,我们称为RootNode,也就是根节点,根节点只能是dict或者array

上面的例子中,根节点就是dict,被dict/dict包裹的内容就是多个key-value形式的数据, 其中key为一行,紧挨着的后面的行就是该key对应的value

1.2.2、array

array就是数组,这在不同的语言里的中文称呼都是一样的。

array里可以放任意相同数据类型的数据。

示例1:

<?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>phoneNumbers</key>
	<array>
		<string>15656059398</string>
		<string>15656059399</string>
	</array>
	...
</dict>
</plist>

示例2:

<?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">
<array>
	<dict>
		<key>xx</key>
		<array>
			<integer>100</integer>
			<integer>150</integer>
			<integer>200</integer>
			<integer>250</integer>
		</array>
		...
	</dict>	
</array>
</plist>
1.2.3、string

string就是字符串,这在不同的语言里的中文称呼都是一样的。

示例:

<?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>phoneNumbers</key>
	<array>
		<string>15656059398</string>
		<string>15656059399</string>
	</array>
	<key>location</key>
	<string>中国北京市朝阳区</string>
</dict>
</plist>
1.2.4、integer

integer就是十进制的整数。整数分为正整数和负整数,都是允许的。

示例:

<?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>xx</key>
	<array>
		<integer>-100</integer>
		<integer>150</integer>
		<integer>-200</integer>
		<integer>250</integer>
	</array>
	<key>age</key>
	<integer>18</integer>
</dict>
</plist>
1.2.5、real

real就是十进制的实数(浮点数),我们通常称为double类型的数字,其实就是包含小数点的数字。

示例:

<?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>xx</key>
	<array>
		<real>-100.0</real>
		<real>150.0</real>
		<real>-200.00</real>
		<real>250.00</real>
	</array>
	<key>weight</key>
	<real>75.5</real>
</dict>
</plist>
1.2.6、true

trueBoolean类型的常量。

示例:

<?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>xx</key>
	<array>
		</true>
		</true>
		</true>
		</true>
	</array>
	<key>male</key>
	</true>
</dict>
</plist>
1.2.7、false

falseBoolean类型的常量。

示例:

<?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>xx</key>
	<array>
		</false>
		</true>
		</true>
		</false>
	</array>
	<key>married</key>
	</false>
</dict>
</plist>
1.2.8、date

dateISO 8601格式化的日期和时间。

示例:

<?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>xx</key>
	<array>
		<date>2000-04-22T06:23:04Z</date>
		<date>2000-04-22T06:23:04Z</date>
		<date>2000-04-22T06:23:04Z</date>
		<date>2000-04-22T06:23:04Z</date>
	</array>
	<key>birthday</key>
	<date>2000-04-22T06:23:04Z</date>
</dict>
</plist>
1.2.9、data

data是经过Base64编码的二进制数据。

示例:

<?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>xx</key>
	<array>
		<data>SSBMb3ZlIHlvdSEgeW91IGxvdmUgbWUgdG9vPw==</data>
		<data>SSBMb3ZlIHlvdSEgeW91IGxvdmUgbWUgdG9vPw==</data>
		<data>SSBMb3ZlIHlvdSEgeW91IGxvdmUgbWUgdG9vPw==</data>
		<data>SSBMb3ZlIHlvdSEgeW91IGxvdmUgbWUgdG9vPw==</data>
	</array>
	<key>image</key>
	<data>SSBMb3ZlIHlvdSEgeW91IGxvdmUgbWUgdG9vPw==</data>
</dict>
</plist>
1.3、使用Xcode生成plist文件

1、打开Xcode

2、通过菜单File -> New -> File..菜单打开如下界面:

3、选择任意Tab中的Property List后,点击Next按钮,出现如下界面:

4、输入要保存的文件名后,点击Create按钮,出现如下界面:

使用该工具创建的plist文件能够保证是正确的,如果您手动创建,很可能会创建出不合法的plist文件。

1.4、PlistBuddy读取plist文件

macOS系统中自带了处理plist格式的工具PlistBuddy

1.5、plist转JSON

在线plistJSON互转工具:http://json2plist.sinaapp.com

macOS系统中自带了plutil,他能够将plist转化为其他格式, 使用方法如下:

plutil -convert json in.plist -o out.json
1.6、plist在iOS中的使用场景
1.7、使用dd-plist处理plist文件

dd-plist是一个Google开源的处理plist格式的Java库。

dd-plistGitHub上的网址:https://github.com/3breadt/dd-plist