XML структура для персонального органайзера - PullRequest
2 голосов
/ 16 октября 2008

Я занимаюсь персональным органайзером в учебных целях, и я никогда не работал с 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, если это имеет какое-либо отношение.

Ответы [ 5 ]

2 голосов
/ 16 октября 2008

Твой путь вполне адекватен мне. Однако я предпочитаю дочерние теги атрибутам, поэтому мой путь будет больше похож на:

<activity>
  <name>Mike's Birthday</name>
  <time>2100</time>
  <address>Mike's Place</address>
  <urgency>10</urgency>
  <description>activity description</description>
</activity>

Но, как я уже сказал, твой путь в порядке.

Быстрый вопрос, однако - почему бы не база данных?

1 голос
/ 16 октября 2008

Возможно, вы пришли к этому наивно, но главная особенность вашего XML-дизайна заключается в том, что он оптимизирован для поиска по дате. Если ваш XML-документ большой, и вы выполняете большой поиск по дате (что, я подозреваю, является наиболее распространенным вариантом использования в персональном органайзере), это хорошо.

Выполнение этого шаблона XPath:

/calendar/year[@value='2008']/month[@value='10']/day[@value='7']/activity

рассмотрит намного меньше узлов, чем будет, используя шаблон, который вам понадобится в упрощенной организации Kev:

/calendar/activity[@year='2008' and @month='10' and @day='7']

, который в основном должен смотреть на каждый узел в документе.

Заметьте, кстати, что я предполагаю, что атрибуты month и day являются числовыми. Это важно, потому что вы почти наверняка захотите отсортировать эти данные в какой-то момент, и если вы не собираетесь поддерживать порядок сортировки в документе (для которого, я допускаю, может быть задан аргумент), вы ' Вам понадобятся эти атрибуты в форме, в которой их легко отсортировать.

Также важно, чтобы вы были последовательны в том, как вы храните числовые данные в этих атрибутах. (Если вы хотите выглядеть умно на собраниях, вы можете сказать, что вы устанавливаете канонические представления ваших типов данных.) Если вы используете начальные нули несколько раз, а не другие, например, ни один из этих шаблонов XPath не будет работать надежно, потому что @day='7' не будет соответствовать атрибуту day, установленному на "07". (Вы можете обойти это, преобразовав атрибуты в числа в вашем XPath, используя функцию number(), но лучше избежать проблемы во-первых.)

0 голосов
/ 16 октября 2008

Возможно, стоит взглянуть на xCal , XML-совместимое представление стандарта iCalendar , для некоторых потенциально продуманных идей.

0 голосов
/ 16 октября 2008

Я думаю, что ваша структура будет хорошо для того, что вы делаете.

Если вы планируете использовать это частично для изучения XML, вы можете рассмотреть возможность использования сочетания атрибутов и элементов, чтобы научиться работать с коллекциями каждого из них. Как только вы освоитесь с XML, вы, вероятно, начнете определять правила, которые будете использовать для определения того, какие свойства становятся атрибутами, а какие - элементами.

С помощью правильного кода вы можете перемещать информацию назад и вперед между файлами XML и таблицами базы данных. Вы также можете начать изучение XSL , чтобы вы могли практиковаться в перемещении вещей без изменения исходного XML-файла (или, если данные находятся в таблице, даже не иметь исходного XML-файла).

0 голосов
/ 16 октября 2008

Вы можете сгладить эту иерархию до:

<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, чтобы вы могли однозначно идентифицировать деятельность.

...