4. Обработка нескольких пространств имен

Пространство имен в XML представляет собой набор имен элементов и атрибутов. Например, в пространстве имен XHTML мы находим имена элементов, такие как body, link и h1, а также имена атрибутов, такие как href и align.

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

4.1. Глоссарий терминов пространства имен

4.1.1. URI: Universal Resource Identifier

Формально каждое пространство имен называется URI или универсальным идентификатором ресурса. Хотя URI часто выглядит как URL-адрес, существует важная разница:

  • URL (Universal Resource Locator) соответствует более или менее фактической веб-странице. Если вы вставляете URL-адрес в свой браузер, вы ожидаете получить какую-либо веб-страницу.
  • URI - это просто уникальное имя, которое идентифицирует конкретную концептуальную сущность. Если вы вставляете его в браузер, вы можете получить веб-страницу или не можете; не требуется, чтобы URI, который определяет данное пространство имен, также является URL-адресом.

4.1.2. NSURI: Namespace URI

Не все URIs определяют пространства имен.

Термин NSURI для NameSpace URI - это URI, который используется для уникальной идентификации определенного пространства имен XML.

Примечание

The W3C Recommendation Namespaces in XML 1.0 предпочитают термин имя пространства имен для более широко используемого NSURI.

Например, здесь есть NSURI, который идентифицирует «XHTML 1.0 Strict» диалект XHTML:

http://www.w3.org/1999/xhtml

4.1.3. Пустое пространство имен

В рамках данного документа ни один набор имен элементов и атрибутов не может быть отнесен к определенному пространству имен и соответствующему NSURI. Эти элементы и атрибуты, как говорят, находятся в пустом пространстве имен.

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

Например, многие страницы XHTML используют пустое пространство имен, потому что все имена находятся в одном пространстве имен и потому, что браузеру не требуется NSURI, чтобы отображать их правильно.

4.1.4. Clark notation

Каждый элемент и имя атрибута в документе связаны с определенным пространством имен и соответствующим им NSURI, иначе он находится в пустом пространстве имен. В общем случае документ может указывать NSURI для каждого пространства имен; см. раздел 4.2. Синтаксис документов с несколькими пространствами имен.

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

Когда ваш документ представлен как ElementTree, атрибут .tag, который указывает на Element , содержит как NSURI, так и имя элемента с использованием обозначения Кларка, названного в честь его изобретателя Джеймса Кларка.

Когда NSURI элемента известен, атрибут .tag содержит строку этой формы:

"{NSURI}name"

Например, когда правильно построенный документ XHTML 1.0 Strict обрабатывается в ElementTree, атрибут .tag корневого элемента документа будет выглядеть следующим образом:

"{http://www.w3.org/1999/xhtml}html"

Примечание

Нотация Кларка фактически не появляется в исходном файле XML. Она используется только в представлении ElementTree документа.

Для имен элементов и атрибутов в пустом пространстве имен нотация Кларка - это просто имя без префикса «{NSURI}».

4.1.5. Предок (Ancestor)

В понятие предок элемента включают его непосредственного родителя, родителя родительского элемента и т.д. до корня дерева. У корневого узла нет предков.

4.1.6. Потомок (Descendant)

Потомки элемента включают его прямых детей, детей его детей и т.д. до листьев дерева документа.

4.2. Синтаксис документов с несколькими пространствами имен

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

Вот небольшой фрагмент, чтобы показать вам общую идею:

<fo:inline font-style='italic' font-family='sans-serif'>
<xsl:copy-of select="$content"/>
</fo:inline>

inline элемент находится в пространстве имен XSL-FO, которое в этом документе использует префикс пространства имен fo:. Элемент copy-of находится в пространстве имен XSLT, префиксом которого является «xsl:».

В вашем документе вы должны определить NSURI, соответствующий каждому префиксу пространства имен. Это можно сделать несколькими способами.

  • Любой элемент может содержать атрибут «xmlns: P =« NSURI »», где P - префикс пространства имен для этого NSURI.
  • Любой элемент может содержать атрибут «xmlns =» NSURI ». Это определяет NSURI, связанный с пустым пространством имен.
  • Если элемент или атрибут не содержит префикс пространства имен, он наследует NSURI ближайшего элемента-предка, который имеет префикс.
  • Некоторые атрибуты могут встречаться где угодно в любом документе в пространстве имен «xml:», которое всегда определяется.

Например, любой элемент может иметь атрибут «xml: id», который служит для идентификации уникального элемента в документе.

Вот небольшой правильный XHTML-файл со всеми украшениями, рекомендованными организацией W3C:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
  <title>My page title</title>
</head>
<body>
  <h1>Hello world</h1>
</body>
</html>

Атрибут xmlns элемента html указывает, что все его дочерние элементы находятся в пространстве имен XHTML 1.0 Strict.

Атрибут xml: lang = “en” указывает, что документ использует английский язык.

Вот более подробный пример. Это корневой элемент таблицы стилей XSLT. Префикс «xsl:» используется для элементов XSLT; префикс «fo:» используется для элементов XSL-FO; и третье пространство имен с префиксом «date:» также включено. В этом документе не используется пустое пространство имен.

    <xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:date="http://exslt.org/dates-and-times">

4.3. Карты пространства имен

Карта пространства имен - это словарь Python, который связывает префиксы пространства имен с пространствами имен. Ключи словаря являются префиксами пространства имен, и каждое связанное значение является именем пространства имен как NSURI.

Карты пространства имен используются в нескольких целях.

  • При чтении XML-файла с несколькими пространствами имен вы можете использовать карту пространства имен в процессе поиска и извлечения элементов и атрибутов из ElementTree. См., Например, раздел 9.5, «Element.find (): найти соответствующий подэлемент».
  • При создании нового документа XML, содержащего элементы в нескольких пространствах имен, вы можете использовать карту пространства имен, чтобы указать, какие префиксы пространства имен появятся, когда ElementTree будет сериализован в XML-форму. См. Раздел 7.2, «Конструктор Element ()» и раздел 7.8 «Конструктор SubElement ()» для подробностей.

Например, в конце раздела 4.2 «Синтаксис документов с несколькими именами» есть тег начала xsl: stylesheet, который определяет xsl: как префикс для пространства имен XSLT, fo: для пространства имен XSL-FO и date : для date-and-time. Вот карта пространства имен, которая описывает те же отношения префиксов к NSURI:

nsm = {"xsl":  "http://www.w3.org/1999/XSL/Transform",
"fo":   "http://www.w3.org/1999/XSL/Format",
"date": "http://exslt.org/dates-and-times"}

Чтобы определить NSURI пустого пространства имен , используйте запись с ключом None. Например, эта карта пространства имен будет определять элементы без пространства имен как принадлежащие XHTML, а элементы с префиксом пространства имен «xl:» относятся к пространству имен XLink:

nsm = {None: "http://www.w3.org/1999/xhtml",
"xl": "http://www.w3.org/1999/xlink"}