В настоящее время я создаю 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-схемы, поддерживая обратную совместимость и сталкиваясь с теми же проблемами или решениями здесь? Любые рекомендации или советы будут оценены.
Пространства имен, пространства имён, пространства имен, пространства имен. –
То есть: Имейте пространство имен для вашего контента версии 1. Если вы делаете несовместимые изменения, используйте новое пространство имен. Затем вы можете содержать контент из обоих пространств имен в одном документе, если вы хотите сгенерировать что-то совместимое с обеими версиями, и/или определить и документировать свою собственную логику приложения для обработки смешанных документов. –
Да, пространство имен, я использовал их, но тогда вам нужно сгенерировать 2 документа правильно? 1 в старом пространстве имен, 1 в новом пространстве имен. И в этот момент вы действительно ничего не расширили, вы просто создали новый формат. – Lavaftw