Подтвердить что ты не робот

Каковы наилучшие методы проектирования XML-схем?

Как любительский разработчик программного обеспечения (я все еще в академических кругах), я написал несколько схем для XML-документов. Я регулярно сталкиваюсь с дизайном flubs, которые вызывают уродливые XML-документы, потому что я не совсем уверен, что именно семантика XML.

Мои предположения:

<property> value </property>

свойство = значение

<property attribute="attval"> value </property>

Свойство со специальным дескриптором - атрибутом.

<parent>
  <child> value </child>
</parent>

У родителя есть характеристический "ребенок", который имеет значение "значение".

<tag />

"Тег" - это флаг или он напрямую преобразуется в текст. Я не уверен в этом.

<parent>
  <child />
</parent>

"child" описывает "родительский". "child" - это флаг или логический. Я тоже не уверен в этом.

Неоднозначность возникает, если вы хотите сделать что-то вроде отображения декартовых координат:

<coordinate x="0" y="1 />

<coordinate> 0,1 </coordinate>

<coordinate> <x> 0 </x> <y> 1 </y> </coordinate>

Какой из них наиболее прав? Я склонялся к третьему, основываясь на моей нынешней концепции дизайна XML-схемы, но я действительно не знаю.

Каковы некоторые ресурсы, которые кратко описывают, как эффективно создавать схемы xml?

4b9b3361

Ответ 2

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

Итак, в вашем примере с координатами, <coordinate x="0" y="1" /> а также <coordinate> <x>0</x> <y>1</y> </coordinate> оба разумны для меня.

Но <coordinate> 0,1 </coordinate> не очень хорошо, потому что он хранит две логические части данных (X-координату и Y-координату) в одном XML node - принуждение потребителя к анализу данных вне их анализатора XML. И хотя разделение строки запятой довольно простое, все же есть некоторые неясности, например, что происходит, если в конце есть дополнительная запятая.

Ответ 3

Я согласен с рекомендацией w/cdragon ниже, чтобы избежать варианта № 2. Выбор между # 1 и № 3 в значительной степени зависит от стиля. Мне нравится использовать атрибуты для того, что я считаю атрибутами сущности, и элементы для того, что я считаю данными. Иногда трудно классифицировать. Тем не менее, они не являются "неправильными".

И пока мы находимся на тему проектирования схемы, я добавлю два цента относительно моего предпочтительного уровня (максимального) повторного использования (обоих элементов и типов), что также может облегчить внешнюю "логическую" привязку этих сущности в, скажем, словаре данных, хранящемся в базе данных.

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

& бык; Подход сада Эдема http://blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx

Использует модульный подход, определяя все элементы глобально и, подобно венецианскому методу Blind, все определения типов объявляются глобально. Каждый элемент глобально определяется как непосредственный дочерний элемент node, а его атрибут типа может быть установлен на один из названных сложных типов.
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="TargetNamespace" xmlns:TN="TargetNamespace" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified" attributeFormDefault="unqualified"/> 
<xs:element name="BookInformation" type="BookInformationType"/> 
  <xs:complexType name="BookInformationType"/> 
    <xs:sequence> 
      <xs:element ref="Title"/> 
      <xs:element ref="ISBN"/> 
      <xs:element ref="Publisher"/> 
      <xs:element ref="PeopleInvolved" maxOccurs="unbounded"/> 
    </xs:sequence> 
  </xs:complexType> 
  <xs:complexType name="PeopleInvolvedType"> 
    <xs:sequence> 
      <xs:element name="Author"/> 
    </xs:sequence> 
  </xs:complexType> 
  <xs:element name="Title"/> 
  <xs:element name="ISBN"/> 
  <xs:element name="Publisher"/> 
  <xs:element name="PeopleInvolved" type="PeopleInvolvedType"/> 
</xs:schema>
Преимущество этого подхода в том, что схемы можно использовать повторно. Поскольку оба элемента и типы определены глобально, оба доступны для повторного использования. Этот подход предлагает максимальное количество повторно используемого содержимого. Недостатки заключаются в том, что схема является многословной. Это было бы подходящим дизайном при создании общих библиотек, в которых вы можете позволить себе делать какие-либо предположения о масштабах элементов и типов схемы и их использовании в других схемах, особенно в отношении расширяемости и модульности.


Поскольку каждый отдельный тип и элемент имеют одно глобальное определение, эти канонические частицы/компоненты могут быть связаны один-к-одному с идентификаторами в базе данных. И хотя на первый взгляд это может показаться утомительной рутинной задачей для поддержания связей между текстовыми частицами/компонентами XSD и базой данных, SQL Server 2005 может фактически генерировать идентификаторы компонентов канонической схемы через оператор

CREATE XML SCHEMA COLLECTION

http://technet.microsoft.com/en-us/library/ms179457.aspx

И наоборот, для построения схемы из канонических частиц SQL Server 2005 предоставляет

SELECT xml_schema_namespace function

http://technet.microsoft.com/en-us/library/ms191170.aspx

са · не · я · кал   Связано с математикой. (уравнения, координаты и т.д.),        "в простейшей или стандартной форме"       http://dictionary.reference.com/browse/canonical

Другие, более простые в построении, но менее результирующие/более "денормализованные/избыточные" схемы схемы включают

& бык; Подход "Русская кукла" http://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx

В схеме есть один глобальный элемент - корневой элемент. Все остальные элементы и типы вступают вглубь, все глубже, придавая ему имя из-за того, что каждый тип подгоняется к тому, что находится над ним. Поскольку элементы в этом дизайне объявлены локально, они не будут повторно использоваться с помощью операторов import или include.

& бык; Подход Salami Slice http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx

Все элементы определяются глобально, но определения типов определяются локально. Таким образом, другие схемы могут повторно использовать элементы. При таком подходе глобальный элемент с его локально определенным типом обеспечивает полное описание содержимого элементов. Этот информационный "срез" объявляется индивидуально, а затем агрегируется обратно вместе и также может быть собрано вместе для построения других схем.

& бык; Подход венецианского слепого http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx

Подобно подходу Russian Doll, поскольку они используют один глобальный элемент. Подход Venetian Blind описывает модульный подход, назвав и определяя все определения типов глобально (в отличие от подхода Salami Slice, который объявляет глобальные элементы и типы локально). Каждый глобально определенный тип описывает индивидуальный "планшет" и может быть повторно использован другими компонентами. Кроме того, все локально объявленные элементы могут быть квалифицированным пространством имен или пространством имен (разрезы могут быть "открыты" или "закрыты" ) в зависимости от параметра атрибута elementFormDefault в верхней части схемы.

Ответ 4

XML несколько субъективен с точки зрения дизайна - я не думаю, что существуют точные рекомендации относительно того, как элементы и атрибуты должны быть изложены, но я склонен использовать элементы для представления "вещей" и атрибутов для представления единственного числа атрибуты/свойства.

В терминах примера координат либо было бы совершенно приемлемо, но моя склонность состояла бы в том, чтобы пойти с <coordinate x="" y=""/>, потому что он несколько более краток, и делает документ более читабельным, если у вас их много.

Самое главное, однако, это пространство имен схемы. Убедитесь, что (a) у вас есть, и (b) у вас есть версия, чтобы вы могли изменить ситуацию в будущем и выпустить новую версию. Версии могут быть либо датами, либо цифрами, например.

http://company.com/2008/12/something/somethingelse/
urn:company-com:2008-12:something:somethingelse

http://company.com/v1/something/somethingelse/
urn:company-com:v1:something:somethingelse

Ответ 5

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

На мой взгляд, одно важное понимание XML заключается в том, что это не язык: это синтаксис. И каждая модель документа является отдельным языком.

Различные культуры будут использовать XML по-своему. Даже в спецификациях W3C вы можете ощущать запах Lisp в разделенных символом именах XSLT и Java в camelCaseNames XML Schema. Точно так же разные области приложений будут требовать разные идиомы XML.

Модели описательных документов, такие как HTML или DocBook, как правило, помещают печатный текст в текстовые узлы и метаданные в имена и атрибуты элементов.

Другие объектно-ориентированные модели документов, такие как SVG, практически не используют текстовые узлы и вместо этого используют только элементы и атрибуты.

Мои личные эмпирические правила для дизайна модели документов выглядят примерно так:

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

Другой способ сказать:

  • Если это повествование, это не объектно-ориентированное.
  • Если объект объектно ориентирован, объекты модели как элементы и атрибуты атома в качестве атрибутов.

РЕДАКТИРОВАТЬ: Некоторые люди, похоже, хотят полностью отказаться от атрибутов. В этом нет ничего плохого, но мне это не нравится, поскольку он раздувает документы и делает их ненужными для чтения и записи вручную.

Ответ 6

При разработке формата на основе XML часто бывает полезно подумать о том, что вы представляете. Попробуйте насмехаться над некоторыми данными XML, которые соответствуют намеченной цели. Как только у вас есть что-то, что вы удовлетворены тем, что соответствует вашим требованиям, разработайте схему для ее проверки.

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

В этом отношении представление XML для координат может быть:

<coordinate type="cartesian">
  <ordinate name="x">0</ordinate>
  <ordinate name="y">1</ordinate>
</coordinate>

Это относится к различным системам координат. Если бы вы знали, что они всегда будут декартивными, лучше реализовать их можно:

<coordinate>
  <x>0</x>
  <y>1</y>
</coordinate>

Конечно, последний может привести к более подробной схеме, так как каждый тип элемента должен был бы объявить (хотя я бы надеялся, что сложный тип был определен, чтобы на самом деле выполнять тяжелую работу для этих элементов).

Как и в программировании, часто существует множество способов достижения одних и тех же целей, но во многих ситуациях нет правильного и неправильного, только лучше и хуже. Важно оставаться последовательным и пытаться быть интуитивным, чтобы, когда другие смотрят на вашу схему, они могут понять, чего вы пытались достичь.

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

Ответ 7

В наших Java-проектах мы часто используем JAXB для автоматического анализа XML и преобразования его в структуру объекта. Думаю, для других языков вам будет что-то похожее. Подходящий генератор может автоматически создать структуру объекта на выбранном вами языке программирования. Это значительно упрощает обработку XML, но при этом имеет портативное представление XML для связи между системами.

Если вы используете такое автоматическое сопоставление, вы обнаружите, что это сильно ограничивает схему - <coordinate> <x> 0 </x> <y> 1 </y> </coordinate> - это путь, если вы не хотите делать специальную магию в переводе. Вы получите класс Coordinate с двумя атрибутами x и y с соответствующим типом, как указано в схеме.

Ответ 8

Мне было поручено написать кучу XML-схем, чтобы интегрировать системы моей компании с нашими клиентами. Я разработал дюжину из них более 10 лет назад и увидел, что многие функции расширения в спецификации не очень хорошо работают на практике. Прежде чем разрабатывать новые, я искал текущие лучшие практики (и прибыл сюда!).

Некоторые из приведенных выше советов полезны, но мне не нравятся почти все ссылки. Лучшее место с дизайнерскими рекомендациями, которые я нашел, было от Microsoft.

Лучшей ссылкой является Шаблоны проектирования схемы XML: избежание сложности. Здесь вы найдете этот здравый совет:

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

и дайте подробные пояснения к следующим рекомендациям:

  • Почему вы должны использовать объявления глобальных и локальных элементов
  • Почему вы должны использовать объявления глобальных и локальных атрибутов
  • Почему вы должны понимать, как пространства имен XML влияют на схему XML W3C
  • Почему вы всегда должны устанавливать elementFormDefault на "квалифицированный"
  • Почему вы должны использовать группы атрибутов
  • Почему вы должны использовать группы моделей
  • Почему вы должны использовать встроенные простые типы
  • Почему вы должны использовать сложные типы
  • Почему вы не должны использовать объявления нотации
  • Почему вы должны тщательно использовать группы замещения.
  • Почему вы должны одобрять key/keyref/unique по ID/IDREF для ограничений личности
  • Почему вы должны тщательно использовать схемы хамелеонов.
  • Почему вы не должны использовать значения по умолчанию или фиксированные значения, особенно для типов xs: QName
  • Почему вы должны использовать ограничение и расширение простых типов
  • Почему вы должны использовать расширение сложных типов
  • Почему вы должны тщательно использовать ограничение сложных типов.
  • Почему вы должны тщательно использовать абстрактные типы.
  • Использовать подстановочные знаки для обеспечения четко определенных точек расширяемости.
  • Не используйте переопределение групп или типов

Мой совет о их совете заключается в том, что, когда они говорят "используйте осторожно", вы должны просто избегать этого. Мое впечатление, что спецификации Schema не были написаны разработчиками программного обеспечения. Они пытались использовать некоторые концепции ориентации на объекты, но все-таки путались. Многие механизмы расширения бесполезны или чрезвычайно многословны. Я действительно не понимаю, как кто-то мог придумать ограничение сложных типов.

Еще две интересные статьи на этом сайте:

И один совет, который распространен, - это указать ваши схемы с чем-то отличным от официальной спецификации. Relax NG выглядит наиболее предпочтительным языком спецификаций. К сожалению, вы потеряете одну из лучших функций, которая является стандартизацией.

Ответ 9

Посмотрите на отношения данных, которые вы пытаетесь представить, - лучший подход, который я нашел.

Ответ 10

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

Тем не менее, я обычно предпочитаю "если он говорит что-то о node это атрибут, в противном случае это подход" младший ".

В вашем примере я бы пошел за:

<coordinate>
    <x>0</x>
    <y>1</y>
</coordinate>

потому что x и y являются свойствами координаты, а фактически ничего не говорят о xml, а об объекте, представленном им.

Ответ 11

Я думаю, это зависит от того, насколько сложна или сложна структура.
Я сделаю x и y как атрибут, если только x и y не имеют собственных данных

Вы можете посмотреть HTML или любую другую форму разметки, которая используется для определения вещей (XAML в случае WPF, MXML в случае вспышки), чтобы понять, почему что-то выбрано как атрибут как дочерний node )

Если x и y не должны повторяться, они могут быть атрибутами.

Предположим, что координаты имеют несколько x и y, я предполагаю, что xml не позволяет использовать несколько атрибутов с тем же именем для node. В этом случае вам придется использовать дочерние узлы.

Ответ 12

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

Основное соображение заключается в том, что иногда чище использовать атрибут. Поскольку элемент может иметь только один атрибут данного имени, вы застряли с мощностью 1:1. Если вы представляете данные в качестве дочернего элемента, вы можете использовать любую мощность, которую хотите (или быть открытыми для продолжения ее позже).

Ответ Роба Уэллса выше прав: это зависит от отношений, которые вы пытаетесь моделировать.

В любое время, когда явно не будет ничего, кроме отношения 1:1, атрибут может быть более чистым.

Ответ 13

Здесь - отличный список методов для разработки грамматики XML.

Как указано выше, это субъективная практика, но этот сайт дает некоторые полезные направления, такие как "использовать этот шаблон для решения проблемы X"... или "преимущества и недостатки...".

Ответ 14

Я обнаружил, что форма атрибута более управляема при работе с декартовыми координатами. Мои проекты, как правило, требуют нескольких пространств имен, и разделение определения типа координат между пространствами имен становится уродливым в форме подэлемента. В форме подэлемента вы должны либо квалифицировать подэлементы, жонглировать пространства имен в базовом или корневом элементе, либо по умолчанию для неквалифицированных имен элементов (т.е. namespace скрывая)