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


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

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

10 64

10 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

[*] плохо = сломано, как задумано

обновление: старое эссе об этом не-решении a без проблем.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

например: пространства имен 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.

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