Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Много боли, никакой выгоды.

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

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

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

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

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

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

[*] ПЛОХО = не соответствует задуманному

ОБНОВЛЯТЬ: Старое эссе о нерешении непроблемы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Оба имеют тег с именем «местоположение», но для каждого этот тег означает разные вещи и содержит разные поля.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top