Для чего нужны пространства имен XML?

Это то, что мне всегда трудно объяснить другим: почему существуют пространства имен XML? Когда мы должны их использовать, а когда нет? Каковы распространенные подводные камни при работе с пространствами имен в XML?

Кроме того, как они связаны со схемами XML? Должны ли схемы XSD всегда быть связаны с пространством имен?

10 ответов

Решение

Они предназначены для объединения нескольких языков разметки, не беспокоясь о конфликтах имен элементов и атрибутов.

Например, посмотрите на любой бит кода XSLT, а затем подумайте, что произойдет, если вы не используете пространства имен и пытаетесь написать XSLT, в котором выходные данные должны содержать элементы "template", "for-each" и т. Д., Синтаксические ошибки, это что.

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

Почему существуют пространства имен XML?

Потому что еще в 1997 году некоторые очень влиятельные люди в W3C хотели их и не приняли бы "нет" за ответ. Даже когда это было продемонстрировано, я осмелюсь окончательно сказать, что существуют более эффективные способы решения "проблемы", которая, как они думали, у них есть, они все же используют свое влияние, чтобы записать свои желания в Рекомендации W3C.

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

Много боли, нет выгоды.

Когда мы должны их использовать, а когда нет?

Вы никогда не должны использовать их, если можете помочь. К сожалению, постоянное продвижение этого устройства BAD[*] заинтересованными сторонами привело к появлению кластера спецификаций, которые делают практически невозможным не сталкиваться с пространствами имен XML в тот или иной момент. Таким образом, даже если вы сами отказываетесь от пространств имен XML, вы обнаружите, что инкрустированный пространствами имен грубый шпионит за вами со всех сторон или, что еще хуже, наборы инструментов, которые просто отказываются работать, если вы не кормите их таким грубым.

Каковы распространенные подводные камни при работе с пространствами имен в XML?

Одна очень распространенная ловушка заключается в использовании выражений Xpath с документами, в которых пространство имен было "дефолтным": пространство имен должно быть явным в выражениях. Другая проблема заключается в том, чтобы использовать их "правильно" при построении документов: они создают проблемы из ничего.

Кроме того, как они связаны со схемами XML? Должны ли схемы XSD всегда быть связаны с пространством имен?

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

[*] ПЛОХО = сломано как задумано

ОБНОВЛЕНИЕ: старое эссе о том, что это не решение проблемы.

Это почти то же самое, что спросить "почему мы используем пакеты для Java/C#?":

  • возможность повторного использования: вы можете повторно использовать набор тегов / атрибутов, которые вы определяете, для разных типов XML-документов.
  • модульность: если вам нужно добавить "аспект" в ваш XML; добавить пространство имен в ваш XML-документ проще, чем изменить определение всей XML-схемы.
  • Избегайте загрязнения "основного" пространства имен: вы не заставляете свой синтаксический анализатор работать с огромным определением схемы, просто используйте нужное пространство имен.

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

например, следующие узлы

<a xmlns="uri:foo"/>
<foo:a xmlns:foo="uri:foo"/>
<bar:a xmlns:bar="uri:foo"/>

все семантически идентичны - но очень отличаются от наивного взгляда.

Первый пример приводит к очень распространенной ошибке при разработке XPath - отсутствует тот факт, что "a" находится в пространстве имен - таким образом, //a не дает совпадений. (или, что еще хуже, сопоставление узлов в другом пространстве имен!)

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

Думайте о них как о фамилиях для типов элементов. Если у вас есть два друга по имени Боб, и вы говорите об одном из них, кто-то может спросить, о каком Бобе вы говорите. Просто сказать "Боб" не очень полезно, поэтому вы говорите "Боб Смит" или "Боб Джонс".

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

XML- это суперязык, что означает, что он является основой для любого языка на основе XML (имеет смысл, верно?). Думайте о XML как о ручке, которая может написать любое предложение на любом языке. Все зависит от автора, и желательно, чтобы язык был известен читателю.

Пространство имен XML- это, по сути, название языка, очень похожее на "английский" или "רברית". Я помогаю получателю XML-документа разобрать его и извлечь из него информацию.

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

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

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

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

Мы используем пространства имен, потому что люди хотят использовать одни и те же слова для обозначения разных вещей в своем собственном Айдахо. Обычно из контекста можно определить, что означает человек. В базе данных персонала XML - это записи персонала. В базе данных реестра транспортных средств XML представляет собой записи реестра транспортных средств.

Оба хранят тег с именем "location", но тег означает разные вещи для каждого и содержит разные поля.

Это круто: но что если вам нужно или вы хотите хранить XML из обоих в одной базе данных? Или, что более интересно, что, если обе базы данных хотят хранить фрагменты XML из некоторой другой, общей базы данных (например, базы данных учетных записей).

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

То, что делает все это полезным, это XPATH.

С учетом вышесказанного, вы можете начать писать выражения XPATH, которые говорят что-то вроде: найди меня любой accounts:account overdue разделы в любом месте в этом XML. Или: найди меня accounts:warning message элементы в любом месте этого конкретного фрагмента XML, где предупреждающее сообщение является дочерним узлом (каким бы глубоким он ни был) personnel:payment узел или vehicle:status узел.

Это выражение XPATH может использоваться где-то в документе XSLT, задачей которого является преобразование XML в XHTML или XPDF для отображения.

Какова отдача? Зачем это делать? Поскольку вы можете искать в лог-файле XML, извлекайте все просроченные сообщения учетных записей, где бы они ни появлялись, не путая их с тегами "message", созданными другими системами, конвертируйте их в xhtml и отображайте их жирным красным цветом с помощью тега css: all без написания клочка процессуального кода.

Например: пространства имен XML на примере

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

<sampleDoc>
   <header title="Hello world!">
      <items>
         <item name="Volvo" color="Blue"/>
      </items>
   </header>
</sampleDoc>

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

<sampleDoc>
   <header title="Hello world!">
      <items>
         <item name="Volvo" color="White" my_unique_namespace:color="#FFFFFF"/>
      </items>
   </header>
</sampleDoc>

Конечно - вы можете изменить имя атрибута. Например, чтобы "my_unique_color". Будь в другом документе, там снова может быть атрибут с таким же именем. Таким образом, если у вас есть уникальное пространство имен (например, наш веб-домен), вы всегда можете использовать одни и те же имена элементов и / или атрибутов без каких-либо проблем.

Пространства имен используются для устранения неоднозначности имен, которые вы используете в документе. Это также дает вам возможность привязать короткое имя к пространству имен, которое затем можно использовать для ссылки на удаленный элемент или атрибут. Само пространство имен относится к местоположению, которое определяет элементы и атрибуты, которые вы используете в документе. Есть еще много чего знать, но это суть. Здесь гораздо больше информации.

Из рекомендации W3...

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

Другие вопросы по тегам