Соглашения о регистрах имен элементов?

120

Есть ли какие-либо формальные рекомендации по корпусу элементов в XML?

Я знаю, что XHTML использует имена элементов в нижнем регистре (в отличие от HTML, который канонически использует верхний регистр, но нечувствителен к регистру).

Но я говорю о XML для общего контента.

в нижнем регистре:

<customer> 
   <accountnumber>619</accountnumber>
   <name>Shelby Lake</name>
</customer>

верблюжий:

<customer> 
   <accountNumber>619</accountNumber>
   <name>Shelby Lake</name>
</customer>

PascalCase:

<Customer> 
   <AccountNumber>619</AccountNumber>
   <Name>Shelby Lake</Name>
</Customer>

ВЕРХНИЙ РЕГИСТР:

<CUSTOMER> 
   <ACCOUNTNUMBER>619</ACCOUNTNUMBER>
   <NAME>Shelby Lake</NAME>
</CUSTOMER>

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

Ян Бойд
источник

Ответы:

88

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

Существует философское различие между представлением XML как формата для нейтральных к платформе документов, который стандарты W3C пытаются поощрять, и такими языками, как XAML, которые рассматривают XML как сериализацию графа объектов, зависящих от платформы.

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

Если да, то вы, возможно, захотите вписаться в XHTML, XSLT, SVG, XProc, RelaxNG и другие.

Пит Киркхэм
источник
7
Значит ли это, что нижний регистр с дефисами рекомендуется или не рекомендуется?
WarFox
9
@WarFox Я не думаю, что кто-то дал официальную рекомендацию. IME, форматы, исходящие из w3c для взаимодействия, как правило, имеют стиль дефиса; форматы, которые исходят от Microsoft и некоторых других, как правило, тесно связаны с реализацией и соглашением об именах объектов на языке, используемом для реализации. Если вы используете XML для разделения систем, то отсутствие привязки вашего XML к языковому стилю одного компонента этой системы может заставить вас думать в терминах сообщений, а не объектов, поэтому я бы рекомендовал стиль нижнего регистра и дефиса.
Пит Киркхэм,
5
Обратите внимание, что «строчные буквы с дефисами» имеют некоторые проблемы в XSLT. В частности, легко спутать узел, называемый, скажем, «год от возраста» с формулой «год - возраст» (например, вычесть возраст из года)
Ричард Кеннард
3
@RichardKennard. Эта путаница возможна только на человеческом уровне? Для xslt необходимые пробелы (?) Вокруг оператора обеспечивают четкое и недвусмысленное различие, верно?
Карл Кенингер
1
@KarlKieninger, это правда, но путаница на человеческом уровне - серьезная проблема, ИМХО. Смотрите мой развернутый ответ ниже.
Ричард Кеннард,
64

Не то чтобы это важно, но я всегда был неравнодушен к PascalCase для элементов и camelCase для атрибутов:

<Root>
  <ParentElement attributeId="1">
    <ChildElement attributeName="foo" />
  </ParentElement>
</Root>
Метро Смурф
источник
31

Официальной рекомендации нет.

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

Таким образом .Net XML имеет тенденцию использовать ProperCasing (свидетель XAML), тогда как другой XML будет использовать camelCasing, python_conventions, dot.naming и даже COBOL-CONVENTIONS. W3C, кажется, любит строчные буквы с черточками (например, XSLT) или просто низкие слова с объединением (например, MathML).

Мне нравятся строчные буквы и отсутствие подчеркивания, поскольку это означает, что клавиша [Shift] меньше используется, а пальцы немного ленивы. :)

Лавинио
источник
2
Похоже, что если бы его цель заключалась в «обмене информацией», тогда был бы абсолютно желателен стандарт соглашений об именах. Это также применимо к любым документам, используемым более чем одной конкретной реализацией (например, это не были одноразовые сериализации).
25

Чтобы добавить к ответу Metro Smurf.

Национальная модель обмена информацией (NIEM: http://en.wikipedia.org/wiki/National_Information_Exchange_Model ) предписывает использовать:

  • Верхний CamelCase (PascalCase) для элементов.
  • (нижний) camelCase для атрибутов.

NIEM - хороший вариант, когда вы хотите соответствовать какому-либо стандарту.

Кёрт ван Клиф
источник
1
Вот документ NIEM, в котором описаны соглашения об именах для атрибутов и элементов: niem.gov/documentsdb/Documents/Technical/NIEM-NDR-1-3.pdf
e1i45,
Я знаю, что он старый, но ссылка выше не работает, но эта ссылка, похоже, содержит обновленные сведения о соглашении NIEM для Elements / Attrubutes: reference.niem.gov/niem/specification/naming-and-design-rules/…
CajunCoding
13

Чтобы расширить мой комментарий выше : использование «строчных букв с дефисами» имеет некоторые проблемы в XSLT. В частности, легко спутать узел, называемый, скажем, «год от возраста» с формулой «год - возраст» (например, вычесть возраст из года).

Как отмечает @KarlKieninger, это проблема только на человеческом уровне, а не для парсера XSLT. Однако, поскольку это часто не приводит к ошибке , использование «строчных букв с дефисами» в качестве стандарта вызывает проблемы, ИМХО.

Некоторые подходящие примеры:

<a>1</a><b>1</b>
<xsl:value-of select="a+b"/>
outputs 2, as expected

<a>1</a><b>1</b>
<xsl:value-of select="a-b"/>
DOES NOT ERROR, BUT OUTPUTS NOTHING AT ALL

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

<a-b>1</a-b><c>1</c>
<xsl:value-of select="a-b -c"/>
outputs 0, as expected

Но обратите внимание, насколько запутанно читать вышесказанное!

<a>1</a><a-b>3</a-b><b>2</b>
<xsl:value-of select="a-b"/>
outputs 3

<a>1</a><a-b>3</a-b><b>2</b>
<xsl:value-of select="a -b"/>
outputs -1

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

Ричард Кеннард
источник
3
Продано. Кроме того, инструмент генерации кода MS .NET (xsd.exe) просто удаляет дефисы при создании классов десериализации. Поэтому вместо таких свойств, как «альфа-бета», вы получите «алфавит». Так что имена не только не переводятся точно, их труднее читать. И если вам нужно создать xml с помощью MS SQL, дефисы также являются проблемой. Специфические для MS вещи не должны диктовать стандарты, но они достаточно широко используются, и я думаю, что их можно рассматривать как соображения. И это подталкивает меня к подчеркиванию, разделенному строчными буквами, или смешанному регистру.
Карл Кенингер
1
Похоже, что XSD.exe теперь добавляет атрибут XmlElementAttribute к большинству свойств, и если есть дефис, он явно добавляет строку ElementName в качестве первого параметра, чтобы это было понятно. Проблема, которую я обнаружил, заключается в том, что в зависимости от ваших .NET-библиотек это может не иметь значения - элемент по-прежнему не десериализуется в некоторых системах. Он работает в VS2012 на Win7, но не работает как EXE на сервере 2008 года.
Дэвид Сторфер
13

См. Техническую спецификацию правил именования и разработки XML UN / CEFACT, версия 3.0, стр. 23, где приведены примеры правил, используемых в нескольких стандартах.

Особенности (со страницы 23 версии 3.0 от 17 декабря 2009 г.):

  • LowerCamelCase (LCC) ДОЛЖЕН использоваться для именования атрибутов.
  • UpperCamelCase (UCC) ДОЛЖЕН использоваться для именования элементов и типов.
  • Имена элементов, атрибутов и типов ДОЛЖНЫ быть в единственном числе, если само понятие не является множественным.

( другая ссылка, шведский сайт )

oluies
источник
2
-1: ваша ссылка не работает - возможно, это внутренний URL? Пожалуйста, исправьте это, и я удалю голос против.
Джон Сондерс,
3
Хотя это, безусловно, интересно, процитированный документ в этом конкретном разделе / ​​странице устанавливает правила для XML- схем , а не для парсеров / xml-документов, которые придерживаются этой схемы. Это разные вещи.
MrCC
Для тех, кто задается вопросом, в чем разница между LowerCamelCase и UpperCamelCase: mySettingName - это пример LowerCamelCase (который, возможно, было разумнее называть lowerCamelCase), а MySettingName - пример UpperCamelCase.
Jinlye
4

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

Адам Лютер
источник
1

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

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

DisgruntledGoat
источник
HTML не учитывает регистр. Это не тот же XML / XHTML.
-2

Дело верблюда получает мой голос.

Что касается приведенных примеров, возможно, этот вопрос можно найти по ссылке, которую цитируют.

AnthonyWJones
источник