2016-07-15 12 views
0

В настоящее время я создаю XML-формат. У меня есть большие идеи, где я хочу, чтобы это произошло, но вначале я хотел бы начать с малого и позволить расширяемость. Я много читал на тему атрибутов XML и элементов XML, когда их использовать, плюсы и минусы обоих и т. Д. Общий консенсус (см. here и here), по-видимому, заключается в использовании XML-элементов, если это возможно, если это возможно вы абсолютно уверены, что часть данных является атомарной и никогда не нуждается в расширении или действительно представляет собой метаданные о том, как обрабатывать элемент.Рекомендации по XML: планирование расширяемости

Итак, вот мой вопрос. Скажем, я следую этому руководству и создаю базовый XML-документ, такой как этот.

<person> 
    <name>John Doe</name> 
</person> 

Я следил за тем, что я считал лучшей практикой. Это самая базовая форма, которая работает на данный момент, и я поместил данные в элемент по сравнению с атрибутом в случае, если я хочу продлить его позже. Теперь скажем, что я использовал этот формат некоторое время, и я хочу его расширить. Как мне это сделать, не нарушая какой-либо существующий процесс, который ожидает полного имени во внутреннем тексте элемента name?

Если я продлил это так.

<person> 
    <name>John Doe 
     <firstname>John</firstname> 
     <lastname>Doe</lastname> 
     <alias>John Doe</alias> 
    </name> 
</person> 

Это нарушило бы процесс существующий, потому что теперь InnerText от «имени» будет «Джон DoeJohnDoeJohn Doe». Я знаю, что есть способы справиться с этим, но нужно не нарушать существующие вещи, которые ожидают, что внутренний текст будет содержать полное имя.

Единственный способ, с помощью которого я могу легко расширить это, - сделать новые значения атрибутами «имя». Но что, если мне нужна дополнительная сложность. Как и множественные значения «псевдоним». Это было бы невозможно с атрибутами.

<person> 
    <name firstname="John" lastname="Doe" alias="John Doe">John Doe</name> 
</person> 

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

<person> 
    <name>John Doe</name> 
    <extendedname> 
     <firstname>John</firstname> 
     <lastname>Doe</lastname> 
     <alias>John Doe</alias> 
     <alias>Jon Doe</alias> 
    </extendedname> 
</person> 

Так это будет работать и решить мою проблему, но я спрашиваю себя: «Почему именно это было важно для„имя“, чтобы быть элементом вместо атрибута?» Мне кажется, что в конце концов неважно, было ли «имя» атрибутом «человек» или дочерним элементом с внутренним текстом, потому что в конце концов мне просто пришлось использовать новое имя элемента.

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

<person> 
    <name value="John Doe" />> 
</person> 

Он может легко превратиться в это без нарушения существующих процессов и по-прежнему допускать дальнейшее расширение.

<person> 
    <name value="John Doe" /> 
     <firstname value="John" /> 
     <lastname value="Doe" /> 
     <alias value="John Doe" /> 
     <alias value="Jon Doe" /> 
    </name> 
</person> 

Это вид мне кажется, как руководство должно использовать элементы, где это возможно, и поместить значения в какой-то атрибут «значение» внутри тега. И как всегда, должен применяться здравый смысл, и вы должны использовать внутренний текст, когда он подходит, например, сообщение, заметка или поле примечаний.

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

+0

Пространства имен, пространства имён, пространства имен, пространства имен. –

+0

То есть: Имейте пространство имен для вашего контента версии 1. Если вы делаете несовместимые изменения, используйте новое пространство имен. Затем вы можете содержать контент из обоих пространств имен в одном документе, если вы хотите сгенерировать что-то совместимое с обеими версиями, и/или определить и документировать свою собственную логику приложения для обработки смешанных документов. –

+0

Да, пространство имен, я использовал их, но тогда вам нужно сгенерировать 2 документа правильно? 1 в старом пространстве имен, 1 в новом пространстве имен. И в этот момент вы действительно ничего не расширили, вы просто создали новый формат. – Lavaftw

ответ

1

Предполагая, что вы строите ваши парсер для распознавания контейнеров элементов предыдущих версий, вы можете сделать это:

<doc xmlns:v1="http://example.com/yourformat/1.0" 
    xmlns:v2="http://example.com/yourformat/2.0"> 
    <v1:person> 
    <v1:name>John Doe</v1:name> 
    <v2:name> 
     <v2:firstname>John</v2:firstname> 
     <v2:lastname>Doe</v2:lastname> 
     <v2:alias>John Doe</v2:alias> 
     <v2:alias>Jon Doe</v2:alias> 
    </v2:name> 
    </v1:person> 
</doc> 

Очевидно, что сделать v2 по умолчанию xmlns, если вам не нравится все префиксы.


Таким образом, даже с v2 содержание добавил, документ по-прежнему отлично действует на v1 анализатор.

+0

Да, это сработает, хотя, возможно, потребуется немного больше фона. Я собираю данные с серверов, а затем записываю их в файл XML, который затем извлекается, сохраняется и попадает в базу данных для дополнительной отчетности. Есть много команд и отдельных лиц, имеющих различные уровни навыков. Я могу иметь дело с пространством имен, но изменения хороши, кто-то просто собирается захватить данные, сделать отчет Report = [xml] Get-Content report.xml и проанализировать его, не обращая внимания на пространства имен. Следовательно, мое желание сохранить одно пространство имен и просто планировать его продление. – Lavaftw

+0

С риском легкомысленности: если вы хотите простой, немой формат, который любой может использовать, не обращая внимания на то, что они делают, могу ли я направить вас в JSON? –

+0

Так что я уступаю точку. Пространства имен XML - это правильный способ сделать это, но мой вопрос действительно касался общего руководства, что, когда это возможно, следует использовать элементы, потому что они более расширяемы. Если вы не можете расширить элемент с внутренним текстом, не создавая новое пространство имен, оно действительно не отличается от того, если вы использовали атрибут, а затем решили, что он должен быть сложным элементом, для которого требуется новое пространство имен. В любом случае, я ценю ваше понимание. – Lavaftw