Дизайн XML и повторное использование имен - хорошо или плохо для элементов разных типов иметь одинаковое имя? - PullRequest
4 голосов
/ 22 июля 2010

При проектировании структуры XML иногда возникает желание использовать похожие шаблоны для нескольких типов элементов, которые появляются в одном и том же экземпляре документа.

Например, шаблон Head-Body можетчасто полезно, если вы хотите разделить данные и метаданные (данные о данных), и иногда имеет смысл использовать этот шаблон для нескольких типов элементов в документе (хотя и с разными структурами).

Когда вы используете один и тот же шаблон в нескольких типах элементов, имеет ли смысл:

A ) Сохранить имена элементов одинаковыми?Таким образом, у вас может быть несколько разных типов элементов с именем «Head», каждый из которых имеет свою структуру ... (В вашем элементе «DataSnapshot» может быть элемент «Head», а в элементе «CompiledDataSet» может быть «Head»).элемент внутри него тоже, оба элемента «Голова» имеют различную структуру.)

B ) Или имена ваших элементов должны соответствовать типам, которые определены в вашей схеме?Таким образом, элемент head в вашем элементе «DataSnapshot» может называться «DataSnapshotHead» вместо просто «Head», а ваш элемент «CompiledDataSet» может иметь элемент head «CompiledDataSetHead».

A имеет преимущество в том, что делает шаблон очевидным и делает имена короткими.Но я предполагаю, что это может сбить людей с толку, когда элементы имеют одинаковое имя, но разные структуры.Я думаю, что это может усложнить некоторые виды запросов XPath (не уверен насчет этого - я не очень много использовал XPath).

B обычно требуют более длинных имен элементов и могутсделать менее понятным, что используется тот же шаблон.Но, по крайней мере, из имен элементов будет понятно, какой у них тип.

Ниже приведен пример подхода A :

<DataSnapshot>
      <Head>
        <!-- meta-data that's specific to the 
             DataSnapshot -->
      </Head>
      <DataSets>
        <StandardDataSet setId="abc">
          <Head>
            <!-- meta-data that's specific to the
                 StandardDataSet -->
          </Head>
          <Values>
            <!-- List of values, specific to the 
                 StandardDataSet in their structure -->
          </Values>
        </StandardDataSet>
        <CompiledDataSet setId="xyz">
          <Head>
            <!-- meta-data that's specific to the
                 CompiledDataSet.  Different structure 
                 to the Head of the StandardDataSet. -->
          </Head>
          <Values>
            <!-- List of values, specific to the 
                 CompiledDataSet in structure.
                 i.e. different to those of the
                 StandardDataSet -->
          </Values>
        </CompiledDataSet>
        <!-- Any number of DataSets of different types could
             go here -->
      </DataSets>
    </DataSnapshot>

Обратите внимание, что в приведенном выше примеренесколько элементов, называемых «Head» и «Values», которые имеют разные типы.

Если используется подход B , то в приведенном выше примере будут имена элементов, такие как: DataSnapshotHead, StandardDataSetHead, StandardDataSetValues, CompiledDataSetHead, CompiledDataSetValues.XML будет более громоздким, но будет ли он яснее или проще для анализа?

Я разрабатываю общедоступный XML API, поэтому я зацикливаюсь на таких деталях.Я хочу, чтобы этот API был максимально интуитивно понятным и простым для анализа.Я охотился за лучшими практиками, связанными с этим, но мои навыки работы с Google, похоже, не подходят - я только что нашел много советов о повторном использовании типов в XML-схеме, но ничего о повторном использовании имен элементов.Поэтому я надеюсь, что некоторые из вас, кто работал с гораздо большим количеством XML, чем я, могли бы получить мудрый совет о том, какой подход лучше?

Ответы [ 2 ]

1 голос
/ 22 июля 2010

На самом деле ваши подходы A и B не являются взаимоисключающими.

Здесь пространства имен приходят на помощь.Основная цель пространств имен состоит в том, чтобы устранить неоднозначность в других случаях одних и тех же имен, которые используются в другом контексте или, как говорят лингвисты, в разных тематических мирах .

Поэтому я бы использовал:

snap:head

и

ds:head

, где snap: и ds: - это префиксы пространств имен, которые, соответственно, связаны с имеющимися у меня пространствами именопределены: "headBody:Data SnapShot" и "headBody:Data Set".

Этот подход имеет следующие преимущества :

  1. Помещает каждое имя в свой тематический мир.

  2. Предотвращает конфликты имен.

  3. Делает имена короткими, удобочитаемыми и осмысленными.

  4. Поощряет иерархиюмышление и моделирование.

1 голос
/ 22 июля 2010

ИМХО, склонен к (B) и не рекомендует повторно использовать имена элементов, если вы явно не перемещаете их в отдельные пространства имен, поскольку пользователи вашей схемы могут использовать «ленивые» выражения Xpath, такие как // Head и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...