Редактирование root.plist в качестве исходного кода приводит к повреждению plist

Я только начинаю работать с файлами настроек, и у меня сразу начались проблемы при редактировании root.plist в моем пакете настроек. Мой XCode 4 падает каждый раз, когда я добавляю свойство в plist при редактировании его как списка свойств. Поэтому я подумал, что просто отредактирую исходный код. Кажется, это намного проще.

Но когда я запускаю программу, root.plist не читается. (Он отлично работал с пакетом настроек из демонстрационной программы. Я использую InAppSettingsKit.) Я посмотрел на root.plist в редакторе исходного кода, и он выглядит правильно. Я попытался посмотреть на это как на список свойств, и я получаю сообщение об ошибке, в котором говорится, что plist поврежден.

Вот содержимое моего plist. Может ли кто-нибудь сказать мне, что с ним не так?

<?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>PreferenceSpecifiers</key>
    <array>
<!-- Databases -->
        <dict>
            <key>Title</key>                <string>Databases</string>
            <key>Type</key>                 <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>Type</key>                 <string>PSToggleSwitchSpecifier</string>
            <key>Title</key>                <string>db0</string>
            <key>Key</key>                  <string>db0_preference</string>
            <key>DefaultValue</key>         <true/>
        </dict>
        <dict>
            <key>Type</key>                 <string>PSToggleSwitchSpecifier</string>
            <key>Title</key>                <string>db1</string>
            <key>Key</key>                  <string>db1_preference</string>
            <key>DefaultValue</key>         <true/>
        </dict>
<!-- Sharing Actions -->
        <dict>
            <key>Type</key>                 <string>PSGroupSpecifier</string>
            <key>Title</key>                <string>Sharing Actions</string>
        </dict>
        <dict>
            <key>Type</key>                 <string>PSToggleSwitchSpecifier</string>
            <key>Title</key>                <string>Facebook</string>
            <key>Key</key>                  <string>facebook_preference</string>
            <key>DefaultValue</key>         <true/>
        </dict>
        <dict>
            <key>Type</key>                 <string>PSToggleSwitchSpecifier</string>
            <key>Title</key>                <string>Twitter</string>
            <key>Key</key>                  <string>twitter_preference</string>
            <key>DefaultValue</key>         <true/>
        </dict>
        <dict>
            <key>Type</key>                 <string>PSToggleSwitchSpecifier</string>
            <key>Title</key>                <string>Email</string>
            <key>Key</key>                  <string>email_preference</string>
            <key>DefaultValue</key>         <true/>
        </dict>
        <dict>
            <key>Type</key>                 <string>PSToggleSwitchSpecifier</string>
            <key>Title</key>                <string>BlogSpot</string>
            <key>Key</key>                  <string>blogspot_preference</string>
            <key>DefaultValue</key>         <true/>
        </dict>
<!-- Automatic Email Enable -->
        <dict>
            <key>Type</key>                 <string>PSGroupSpecifier</string>
            <key>Title</key>                <string>Automatic Emailing</string>
        </dict>
        <dict>
            <key>Type</key>                 <string>PSToggleSwitchSpecifier</string>
            <key>Title</key>                <string>Always Send to Email</string>
            <key>Key</key>                  <string>autoblogspot_preference</string>
            <key>DefaultValue</key>         <true/>
        </dict>
<!-- Calendar -->
        <dict>
            <key>Type</key>                 <string>PSRadioGroupSpecifier</string>
            <key>Title</key>                <string>First Day of the Week</string>
            <key>Key</key>                  <string>firstDayOfTheWeek_preference</string>
            <key>Values</key>
                <array>
                    <integer>0</integer>
                    <integer>1</integer>
                    <integer>2</integer>
                    <integer>3</integer>
                    <integer>4</integer>
                    <integer>5</integer>
                    <integer>6</integer>
                </array>
            <key>Titles</key>
                <array>
                    <string>Sunday</string>
                    <string>Monday</string>
                    <string>Tuesday</string>
                    <string>Wednesday</string>
                    <string>Thursday</string>
                    <string>Friday</string>
                    <string>Saturday</string>
                </array>
        </dict>
        <dict>
            <key>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

person Jim    schedule 16.10.2011    source источник


Ответы (1)


В самом конце plist у вас есть оборванный ключ и тег dict.

Строки №90 и №91.

        </dict>
        <dict>
            <key>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

Должно быть что-то вроде:

        </dict>
        <dict />
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

or

        </dict>
        <dict>
            <key>key</key><string>string</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

Я узнал об этом с помощью TextMate. Пакеты -> Список свойств -> Проверить синтаксис. Не говорит вам точную проблему, но доставит вас в область.

Вы также можете получить строку # для просмотра, попытавшись открыть plist в приложении «Редактор списка свойств» (/Developer/Applications/Utilities/Property List Editor.app)

Plists — это XML, поэтому любой валидатор XML обнаружит серьезные проблемы в вашем синтаксисе. Однако эмпирическое правило заключается в том, что для каждого тега нужен закрывающий тег. Для каждого ключа вам нужно значение. Пустые теги должны быть <tag />, а не <tag></tag>.

person Kenny Winker    schedule 16.10.2011
comment
Спасибо. Я только что понял, что могу проверить XML в режиме онлайн. Он показал то же самое. Так что это не было каким-то загадочным XCode. - person Jim; 17.10.2011