Как работать с равными пространствами имен в XML-схеме? [Дубликат]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

24
задан Deduplicator 10 February 2015 в 23:40
поделиться

3 ответа

Ты прав. Идея атрибутов, не являющихся частью пространства имен по умолчанию, заключается в том, что они считаются существующими в «пространстве имен элементов» & mdash; поэтому в этом случае <foo:child/> считается «пространством имен» для @attrib. Обратите внимание, что это просто концептуально; там нет API или что-либо, что ссылается на пространства имен атрибутов таким образом.

Это было выбрано потому, что несколько элементов могут иметь атрибуты с одинаковыми именами, но разные значения & mdash; в отличие от традиционного пространства имен, которое представляет собой набор имен (так что нет дубликатов). В некотором смысле, он дает больше структуры пространству имен, вместо того, чтобы иметь плоский набор.

Вы можете прочитать об этом в очень старую версию рекомендации Namespaces .

Это соглашение означает, что всякий раз, когда вы видите атрибут prefixed, он представляет некоторую «дополнительную» информацию, которая не связана с основной схемой в документе.

14
ответ дан porges 17 August 2018 в 22:09
поделиться
  • 1
    Благодарю. Я немного запутался в том, как представить тег как контекст. Мне кажется, что если «<foo:child /> является« пространством имен »для @attrib», то я бы not должен был добавить дополнительные префиксы для предоставления пространства имен. Другими словами, он будет неквалифицирован, что будет интерпретироваться как находящееся в любом пространстве имен, которое использует элемент. Это верно? Это означало бы, что мой первый пример на самом деле является хорошим способом написать это. – mckamey 22 July 2010 в 22:22
  • 2
    Да, соглашение предназначено для того, чтобы атрибуты были не-именами, как ваш первый пример. "it would be unqualified which would be interpreted as being in whatever namespace the element is using" ... это идея, но обратите внимание, что атрибут будет not иметь те же пространства имен, что и элемент, или элемент как «пространство имен». У него не будет никакого пространства имен - атрибут, имеющий элемент как «пространство имен», является просто соглашением. – porges 23 July 2010 в 00:15
  • 3
    ОК, я думаю, теперь понимаю. Как правило, атрибутам не предоставляется явное пространство имен, поскольку они находятся в контексте элемента, который может иметь пространство имен. Это было бы написано как пример 1. Если для атрибута было определенное пространство имен, это обычно выходит за пределы схемы элемента и должно быть написано как примеры 2 или 3, но обычно это не будет одно и то же пространство имен. – mckamey 23 July 2010 в 01:42
  • 4
    Вы в значительной степени объяснили это лучше, чем я. :) – porges 25 July 2010 в 06:56

В спецификаторе вы правильно считаете пространство имен attrib в первом примере пустым. Тем не менее, здесь есть тонкость, которая может быть не очевидна.

Рассмотрим этот пример далее в спецификации элемента с двумя атрибутами с тем же именем (один префикс и другой нефиксированный).

<!-- This is OK, even though an element cannot have two attributes 
     with the same name -->
<x xmlns:n1="http://www.w3.org" 
   xmlns="http://www.w3.org" >
  <good a="1"     n1:a="2" />
</x>

Это соответствует, потому что два атрибута действительно находятся в двух разных пространствах имен:

  • n1:a принадлежит пространству имен http://www.w3.org (которое является пространством имен для good)
  • a рассматривается как принадлежащее недоступному пространству имен http://wwww.w3.org > good (и отличается от пространства имен good).

Примечание что пространство имен http://wwww.w3.org > good не существует; например, вы не можете запрашивать атрибуты в этом пространстве имен с помощью XPath. Если вы попросите namespace-uri(\\good\a), он будет пустым. Чтобы сделать идею отдельного пространства имен элементов конкретным, я составил пространство имен, у которого есть как пространство имен имен, так и имя вместе с разделителем (> в любом случае не допускается без сохранения значений атрибутов).

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

  • n1:a атрибут принадлежит к элементу глобального атрибута (http://www.w3.org)
  • good принадлежит к разделу «Все типы элементов» (также http://www.w3.org)
  • a принадлежит к элементу Per Тип раздела good (т. Е. http://wwww.w3.org > good).

Вот соответствующая часть спецификации Porges, связанная с:

A.2 Разделы пространства имен XML

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

Все типы типов элементов. В этом разделе отображаются все типы элементов в пространстве имен XML. Каждый из них имеет уникальную локальную часть; комбинация имени пространства имен и локальной части уникально идентифицирует тип элемента.

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

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

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

6
ответ дан 4 revs 17 August 2018 в 22:09
поделиться
  • 1
    Спасибо, Рагху-Додда. Эта тонкость является отличным примером того, почему большая часть XML слишком сложна, что приводит к ненужным ошибкам. – mckamey 26 December 2014 в 22:44
  • 2
    Огромное спасибо. Хорошо знать, что атрибуты prefixed и атрибуты unprefixed в вашем примере оба относятся к одному и тому же пространству имен, но к разным разделам пространства имен. – doABarrelRoll721 16 December 2015 в 02:57
  • 3
    Можем ли мы сказать, что если атрибут определен с помощью <xsd:attribute> (см. этот пример ), он попадает в раздел «Глобальный атрибут» и, следовательно, должен быть префиксом? – dma_k 27 June 2016 в 16:02

Ваша интерпретация спецификации верна. Некоторое логическое обоснование также приведено во втором абзаце раздела 6.2 в спецификации пространств имен, на которую вы ссылались:

интерпретация неподписанных атрибутов определяется элементом, на котором они отображаются.

Но мне также будет интересна более подробная информация о том, почему было выбрано это конкретное поведение.

2
ответ дан Jörn Horstmann 17 August 2018 в 22:09
поделиться
  • 1
    Этот дополнительный параграф, по-видимому, подразумевает, что есть больше информации по этой теме, но я не могу найти его. Мой вопрос к редактору W3C, который написал это, « How является атрибутом unprefixed, интерпретированным с учетом элемента, на котором он появляется? & Quot; – mckamey 22 July 2010 в 22:26
  • 2
    Он интерпретируется программой, которая читает XML-документ. Это не входит в сферу действия rec. Вы интерпретируете это как хотите. Таким образом, создатели XML-словаря решают, в чем смысл атрибутов в каждом элементе. – lkuty 30 October 2014 в 20:59
Другие вопросы по тегам:

Похожие вопросы: