Как разработчик программного обеспечения-любитель (я нахожусь все еще в академии) я записал несколько схем для XML-документов. Я обычно сталкиваюсь с промахами дизайна, которые вызывают ужасно выглядящие XML-документы, потому что я не совсем уверен, какой семантика XML точно.
Мои предположения:
<property> value </property>
свойство = значение
<property attribute="attval"> value </property>
Свойство со специальным дескриптором, атрибутом.
<parent>
<child> value </child>
</parent>
Родитель имеет характерного "ребенка", который имеет значение "значение".
<tag />
"Тег" является флагом, или он непосредственно переводит для отправки текстовых сообщений. Я не уверен в этом.
<parent>
<child />
</parent>
"ребенок" описывает "родителя". "ребенок" является флагом или булевской переменной. Я не уверен в этом, также.
Неоднозначность возникает, если Вы хотите сделать что-то как представление декартовых координат:
<coordinate x="0" y="1 />
<coordinate> 0,1 </coordinate>
<coordinate> <x> 0 </x> <y> 1 </y> </coordinate>
Какой из тех является самым корректным? Я склонился бы к третьему основанному на своей текущей концепции дизайна XML-схемы, но я действительно не знаю.
Каковы некоторые ресурсы, которые кратко описывают, как эффективно разработать схемы XML?
Один генерал (но важный!) рекомендация никогда не состоит в том, чтобы хранить несколько логических частей данных в единственном узле (быть им текстовый узел или узел атрибута). Иначе Вы заканчиваете тем, что нуждались в своей собственной логике синтаксического анализа сверху логика синтаксического анализа XML, которую Вы обычно получаете бесплатно от своей платформы.
Так в Вашем координатном примере, <coordinate x="0" y="1" />
и <coordinate> <x>0</x> <y>1</y> </coordinate>
оба разумны мне.
, Но <coordinate> 0,1 </coordinate>
isn’t очень хороший, потому что it’s, хранящий две логических части данных (X-координата и Y-координата) в единственном XML node— то, чтобы вынуждать потребителя проанализировать данные внешний из их синтаксического анализатора XML. И в то время как разделение строки запятой довольно просто, существуют все еще некоторые неоднозначности как то, что происходит, если существует дополнительная запятая в конце.
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
Я не знаю хорошего ресурса изучения о том, как разработать модели XML-документа (схемы являются просто формальным способом определить модели документа).
, По-моему, одно решающее понимание к XML - то, что это не язык: это - синтаксис. И каждая модель документа является отдельным языком.
Различные культуры будут каждый использовать XML своим собственным специальным способом. Даже в спецификациях W3C можно чувствовать запах Lisp в dash-separated-names XSLT и Java в camelCaseNames XML-схемы. Точно так же различные домены приложения призовут к различным идиомам XML.
модели документа Рассказа такой как HTML или DocBook имеют тенденцию помещать печатаемый текст в текстовые узлы и метаданные на имена элементов и атрибуты.
[еще 1116] объектно-ориентированные модели документа такой как SVG делает минимальное использование текстовых узлов, и вместо этого только используйте элементы и атрибуты.
Мои персональные эмпирические правила для дизайна модели документа проходят примерно так:
Другой способ сказать это мог быть:
РЕДАКТИРОВАНИЕ: Некоторым людям, кажется, нравится полностью воздерживаться от атрибутов. Нет ничего неправильно с ним, но мне не нравится он, поскольку это чрезмерно увеличивает размер документов, и сделайте их ненужными трудно, чтобы читать и записать вручную.
Нет ничего по сути неправильно с использованием элемента или подэлемента для каждого значения, которое требуется представить.
основное соображение состоит в том, что иногда это более чисто для использования атрибута. Так как элемент может только иметь один атрибут имени, Вы застреваете с 1:1 кардинальность. При представлении данных как дочернего элемента можно использовать любую кардинальность, которую Вы хотели бы (или были бы открыты для расширения их позже).
ответ Rob Wells выше является правильным: это зависит от отношений, которые Вы пытаетесь смоделировать.
Любое время там ясно никогда не будет совсем не 1:1 отношения, атрибут может быть более чистым.
При разработке основанного на XML формата часто хорошо думать о том, что Вы представляете. Попытайтесь дразнить некоторые данные XML, который соответствует цели, которую Вы предназначаете. Как только у Вас есть что-то, что Вы удовлетворены этим, отвечает Вашим требованиям, разработайте схему для проверки его.
, Когда desiging формат, я склонен использовать элементы для содержания содержания данных и атрибутов для применения характеристик к данным как идентификатор, имя, тип или некоторые другие метаданные о данных, элемент содержит.
В том отношении, представление 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, записанного в более старую схему, будет намного более трудной.
В наших проектах Java мы часто используем JAXB, чтобы автоматически проанализировать XML и преобразовать его в структуру объекта. Я предполагаю для другого languagues, у Вас будет что-то подобным. Подходящий генератор может создать автоматически структуру объекта на Вашем выбранном языке программирования. Это делает обработку XML часто намного легче, все еще имея портативное представление XML для коммуникации между системами.
при использовании такого автоматического отображения Вы найдете, что это ограничивает схему очень - <coordinate> <x> 0 </x> <y> 1 </y> </coordinate>
, способ пойти, если Вы не хотите сделать специальное волшебство в переводе. Вы закончите с Классом Coordinate
с двумя атрибутами x
и y
с соответствующим типом, как объявлено в схеме.
Я часто борюсь с той же проблемой, но я нахожу, что на практике она действительно не имеет значения, xml является просто данными.
Однако я обычно предпочитаю, "если это говорит что-то об узле, это - атрибут, иначе это - childnode" подход.
В Вашем примере я пошел бы для:
<coordinate>
<x>0</x>
<y>1</y>
</coordinate>
, потому что X и Y являются свойствами координаты, не на самом деле говоря что-либо о xml, но об объекте, представленном им.
Я предполагаю, это зависит от того, насколько сложный или простой структура.
я сделаю X и Y как атрибут, если X и Y не будут иметь свои собственные детали
, можно посмотреть на HTML или любую другую форму разметки, которая используется для определения вещей (XAML в случае WPF, MXML в случае флэш-памяти) для понимания, почему что-то выбрано в качестве атрибута по сравнению с дочерним узлом)
, если X и Y не должны быть повторены, они могут быть атрибутами.
Позволяет, говорят, что координаты имеют несколько X и Y, я предполагаю, что xml не позволяет несколько атрибутов с тем же названием узла. В этом случае необходимо будет использовать дочерние узлы.
Посмотрите на отношения данных, которые Вы пытаетесь представить, лучший подход, который я нашел.
Я согласовываю совет w/cdragon ниже для предотвращения опции № 2. Выбор между № 1 & № 3 является в основном вопросом стиля. Мне нравится использовать атрибуты для того, что я считаю атрибутами объекта и элементами для того, что я считаю данными. Иногда, трудно классифицировать. Тем не менее, ни один не "ошибается".
И в то время как мы находимся по теме дизайна схемы, я добавлю свои два цента относительно моего предпочтительного уровня (максимального) повторного использования (и элементов и типов), который может также упростить внешнюю "логическую" ссылку этих объектов в, скажем, словаре данных, сохраненном в базе данных.
Примечание, что, в то время как "Сад Рая" шаблон схемы предлагает максимальное повторное использование, оно также включает большую часть работы. В нижней части этого сообщения я предоставил ссылки на другие шаблоны, покрытые рядом блога.
• Сад подхода Рая http://blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx
Использование модульный подход путем определения всех элементов глобально и как Жалюзи приближается, все определения типа объявляются глобально. Каждый элемент глобально определяется как непосредственный ребенок узла, и его атрибут типа может быть установлен на один из именованных составных типов.
<?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
caВ · nonВ · iВ · cal, Связанный с Математикой. (уравнения, координаты, и т.д.), "в самой простой или стандартной форме" http://dictionary.reference.com/browse/canonical
Другой, легче создать, но меньше resuable/more "денормализованных/избыточных" шаблонов схемы включает
• российский подход Куклы http://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx
схема имеет один единственный глобальный элемент - корневой элемент. Все другие элементы и типы вкладываются, прогрессивно глубже давая ему имя из-за каждого типа, вписывающегося в тот выше его. Так как элементы в этом дизайне объявляются локально, они не будут допускающими повторное использование через импорт или включать операторы.
• подход Части Салями http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx
Все элементы определяются глобально, но определения типа определяются локально. Таким образом, другие схемы могут снова использовать элементы. С этим подходом глобальный элемент с его локально определенным типом предоставляет полное описание содержания элементов. Эта информация 'часть' объявляется индивидуально и затем агрегировалась назад вместе и может также быть соединена для построения других схем.
• подход Жалюзи http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx
Подобный российской Кукле приближается в этом, они оба используют единственный глобальный элемент. Подход Жалюзи описывает модульный подход путем именования и определения всех определений типа глобально (в противоположность подходу Части Салями, который объявляет элементы глобально и вводит локально). Каждый глобально определенный тип описывает отдельную "планку" и может быть снова использован другими компонентами. Кроме того, все локально заявленные элементы могут быть квалифицированным пространством имен, или пространство имен дисквалифицировало (планки могут быть "открыты" или "закрыты") в зависимости от установки атрибута elementFormDefault наверху схемы.