XML-структура для личного органайзера
Вопрос
Я создаю личный органайзер для учебных целей и никогда не работал с XML, поэтому не уверен, что мое решение лучшее.Вот базовая структура XML-файла, с которым я пришел:
<calendar>
<year value="2008">
<month value="october">
<day value="16">
<activity name="mike's birthday" time="21:00" address="mike's apartment" urgency="10">
activity description.
</activity>
</day>
</month>
</year>
</calendar>
Атрибут срочности должен иметь шкалу от 1 до 10.
Я сделал быстрый поиск в Google и не смог найти хорошего примера.Возможно, это не лучшее решение, и я хотел бы знать, адекватно ли оно.Я делаю приложение на PHP, если это имеет какое-либо значение.
Решение
Ваш путь мне вполне адекватен.Однако я предпочитаю дочерние теги атрибутам, поэтому мой путь будет больше похож на:
<activity>
<name>Mike's Birthday</name>
<time>2100</time>
<address>Mike's Place</address>
<urgency>10</urgency>
<description>activity description</description>
</activity>
Но, как я уже сказал, ваш путь вполне хорош.
Однако быстрый вопрос: почему не база данных?
Другие советы
Возможно, вы пришли к этому наивно, но основная особенность вашего XML-проекта заключается в том, что он оптимизирован для поиска по дате.Если ваш XML-документ большой и вы часто выполняете поиск по дате (что, как я подозреваю, является наиболее распространенным вариантом использования в личном органайзере), это хорошо.
Выполнение этого шаблона XPath:
/calendar/year[@value='2008']/month[@value='10']/day[@value='7']/activity
будет проверять гораздо меньше узлов, чем при использовании шаблона, который вам понадобится использовать с более простой плоской организацией Кева:
/calendar/activity[@year='2008' and @month='10' and @day='7']
который по сути должен просматривать каждый узел в документе.
Заметьте, кстати, что я предполагаю, что month
и day
атрибуты являются числовыми.Это важно, поскольку в какой-то момент вы почти наверняка захотите отсортировать эти данные, и если вы не собираетесь поддерживать порядок сортировки в документе (что, признаю, можно привести в качестве аргумента), вы нам нужны эти атрибуты в такой форме, в которой их можно будет легко сортировать.
Также важно, чтобы вы единообразно хранили числовые данные в этих атрибутах.(Если вы хотите выглядеть умным на собраниях, вы можете сказать, что вы устанавливаете канонические представления ваших типов данных.) Если вы, например, используете ведущие нули несколько раз, а не другие, ни один из этих шаблонов XPath не будет работать надежно, потому что @day='7'
не будет соответствовать day
атрибут установлен на "07"
.(Это можно обойти, преобразовав атрибуты в числа в XPath, используя команду number()
функция, но лучше вообще избегать проблемы.)
Вы можете сгладить эту иерархию до:
<calendar>
<activity
id="123456"
name="mike's birthday"
year="2008"
month="10"
day="16"
time="21:00"
address="mike's apartment"
urgency="10">
activity description.
</activity>
</calendar>
или..
<calendar>
<activity id="12345">
<name>mike's birthday</name>
<year>2008</year>
<month>10<month>
<day>16</day>
<time>21:00</time>
<urgency>10</urgency>
<address>mike's apartment<address>
<description>activity description.</description>
</activity>
</calendar>
Выполнение запросов XPath сделало бы жизнь немного менее болезненной.Я также добавил атрибут id, чтобы вы могли однозначно идентифицировать действие.
Я думаю, ваша структура подойдет для того, что вы делаете.
Если вы планируете использовать это частично для изучения XML, вы можете рассмотреть возможность использования сочетания атрибутов и элементов, чтобы попрактиковаться в работе с коллекциями каждого из них.Как только вы освоитесь с XML, вы, вероятно, начнете определять правила, которые будете использовать, чтобы определить, какие свойства станут атрибутами, а какие — элементами.
Используя правильный код, вы можете перемещать информацию между XML-файлами и таблицами базы данных и обратно.Вы также можете начать учиться XSL так что вы можете попрактиковаться в перемещении объектов, не меняя исходный XML-файл (или, когда данные находятся в таблице, даже не имея исходного XML-файла).