Какое отношение пространство имен имеет к XML? - PullRequest
3 голосов
/ 10 февраля 2010

Что-то меня здесь смущает:

Метод NSXMLParser имеет атрибут namespaceURI:

- (void)parser:(NSXMLParser *)parser 
 didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName

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

Редактировать: Да, я заметил википедию. Но опять это сбивает с толку. Какой смысл размещать одну единственную декларацию пространства имен в верхней части XML-файла, например

xmlns:xhtml="http://www.w3.org/1999/xhtml"

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

Ответы [ 4 ]

7 голосов
/ 10 февраля 2010

Пространства имен XML работают как пространства имен везде.

Они предоставляют возможность уникально различать одинаково именованные элементы или атрибуты. Это делается путем объявления URI пространства имен и, возможно, добавления префикса к имени узла. Этот префикс (необязательно) определяется вместе с объявлением пространства имен.

<!-- node without any namespace (it's in the default namespace) -->
<node>
  <child /><!-- descendants are in the parent namespace by default -->
</node>

<!-- node with explicit default namespace -->
<node xmlns="http://some/namespace/uri/">
  <child /><!-- descendants are in the parent namespace by default -->
</node>

<!-- NS declaration with prefix (node is still in the default namespace!) -->
<node xmlns:prefix="http://some/namespace/uri/">
  <child /><!-- descendants are in the parent's namespace -->
  <prefix:child><!-- explicit namespace assignment by prefix -->
    <grandchild /><!-- prefixes don't propagate, this is in the default namespace! -->
  </prefix:child>
</node>

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

В вашем случае, на примере или <prefix:child />:

didEndElement = "child"
 namespaceURI = "http://some/namespace/uri/"
qualifiedName = "prefix:child"
3 голосов
/ 10 февраля 2010

Пространства имен используются для уточнения имен ваших элементов, префиксы используются для упрощения XML. По умолчанию существует пространство имен с «пустым» uri.

Пример расширения Томалакс:

<!-- Mixing namespaces default namespace -->
<node xmlns:gc="http://other/namespace/gc"> <!-- node is in default NS -->
  <child> <!-- child is still in default NS, inherited from parent - node -->
    <gc:grandchild/>  <!-- grandchild is in the "http://other/namespace/gc", because of gc prefix -->
  </child>
  <child xmlns="http://some/namespace/uri/" xmlns:gc2="http://other/namespace/gc"> <!-- node is in "http://home/namespace/uri" because of declration -->
    <gc2:grandchild/> <!-- again, in "http://other/namespace/gc", despite different prefix -->
    <grandchild/> <!-- yet this one is in "http://home/namespace/uri", no prefix, inherited from parent -->
  </child>
</node>

Отсюда следует, что оба «дочерних» узла являются РАЗЛИЧНЫМИ УЗЛАМИ. Они выглядят одинаково, но их «полностью определенные имена» отличаются ». Это особенно важно в XSL.

То же самое с внуками. gc: grandchild и gc2: grandchild ОДИНАКОВЫ, они используют один и тот же URI пространства имен, но используют разные префиксы. Третий узел внука отличается тем, что он использует свое унаследованное пространство имен от родительского дочернего узла.

Пространства имен важны, потому что они позволяют вам «смешивать и сопоставлять» xml в одном документе из разных словарей. Например, встраивание разметки SVG в документ XHTML. Использование пространств имен предотвращает перекрытие одинаковых имен базовых узлов.

Для большинства простых задач XML они не нужны. Но когда вы начинаете объединять стандарты и т. Д., Они становятся очень важными.

Другой пример - встраивание утверждений SAML в конверты SOAP для веб-сервисов. SOAP - это один стандарт, SAML - другой, независимые стандарты и стандартные органы, но оба позволяют вставлять области «произвольного XML» в свои документы. Пространства имен хранят содержимое отдельно.

3 голосов
/ 10 февраля 2010
1 голос
/ 10 февраля 2010

Пространства имен важны в XML, поскольку у вас могут быть узлы с одинаковым local-name в одной и той же иерархии xml.

Представьте себе XML-документ, описывающий статью в журнале. У вас может быть элемент, который определяет автора (ов) статьи:

<article>
  <head>
    <author>Emily Berthenstien</author>
  </head>
....

Далее в этой статье вы можете найти цитаты, в которых перечислены цитируемые авторы.

<citations>
  <citation>
    <author>Bernard Rightofen</author>
  </citation>  
</citations>       

Как вы различаете 2 "авторских" узла?

Добавление другого пространства имен к элементу "author" в заголовке и узлах цитирования создаст QName для каждого из узлов автора, которые вы затем сможете использовать для доступа к ним конкретно (с помощью XPath или чего-либо еще ) и не путайся. Например, теперь вы можете выбирать только авторов цитирования, используя XPath и его QName:

declare namespace citauths="http://citation/authors/only"

//citauths:author

и только авторы статьи:

declare namespace auths="http://article/authors/only"

//auths:author
...