Для чего нужны пространства имен XML? - PullRequest
67 голосов
/ 24 сентября 2008

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

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

Ответы [ 10 ]

33 голосов
/ 24 сентября 2008

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

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

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

19 голосов
/ 18 апреля 2013

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

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

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

Сильная боль, без усиления .

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

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

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

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

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

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

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

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

17 голосов
/ 24 сентября 2008

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

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

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

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

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

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

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

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

6 голосов
/ 24 сентября 2008

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

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

5 голосов
/ 24 сентября 2008

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

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

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

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

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

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

3 голосов
/ 22 марта 2009

Мы используем пространства имен, потому что люди хотят использовать одни и те же слова, чтобы обозначать разные вещи в своем собственном Айдахо. Обычно из контекста можно определить, что означает человек. В базе данных персонала 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: все без написания ни куска процедурного кода .

1 голос
/ 24 сентября 2008

Например: Пространства имен 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". Будь в другом документе, там снова может быть атрибут с таким же именем. Поэтому, если у вас есть уникальное пространство имен (например, наш веб-домен), вы всегда можете использовать одни и те же имена элементов и / или атрибутов без каких-либо проблем.

0 голосов
/ 24 сентября 2008

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

0 голосов
/ 24 сентября 2008

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

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

...