Пространство имен XML-схемы - PullRequest
1 голос
/ 20 октября 2010

1) Я понимаю, что пространства имен являются средством различения различных схем / словарей, заданных с использованием схемы XML, но я не понимаю, почему это хорошая идея, что пространство имен (для которого схема разрабатывает словарь) указывается всама схема (через атрибут targetNamespace).

а) Не лучше ли было бы вместо этого связать определенное пространство имен с конкретным словарем / схемой в экземплярах документов?Таким образом, при написании документов экземпляра будет полная свобода ассоциировать схему с тем именем пространства имен, которое они пожелают ?!

b) Единственное преимущество, которое я вижу в схеме, определяющей целевое пространство имен, заключается в том, что его создатели имеют возможность поместить документ в конец пространства имен, который может описывать элементы этого пространства имен (если схема использует URLпространство имен).Есть ли другие преимущества?

2) Если схема не имеет targetNamespace, вы должны ссылаться (в пределах документа экземпляра) на конкретную схему, используя атрибут noNamespaceSchemaLocation вместо атрибута schemaLocation.

Не было бы проще, если бы вместо этого экземпляр документа просто указывал расположение схемы и позволял валидатору схемы XML выяснить, указывает ли схема targetNamespace?

спасибо

Ответы [ 3 ]

2 голосов
/ 21 октября 2010

Мне известно только одно определение Пространства имен XML и одно определение определения схемы XML также на http://www.w3.org. Поскольку схема XML очень сложна, один из трех стандартов определил стандарт XML Схема Часть 0: учебное пособие, второе издание , Схема XML, часть 1: структуры, второе издание и Схема XML, часть 2: типы данных, второе издание .

Если вам известно больше определений пространств имен XML и XML Schema (больше «словарей»), пожалуйста, опубликуйте ссылку на определение, которое вы имеете в виду.

Значение targetNamespace в корне любой схемы очень легко понять. XML это не язык. Это метаязык. XML-схема помогает нам определить один язык. Мы должны дать уникальное имя определенному языку (схеме). Это targetNamespace схемы. Таким образом, если какой-то документ следует интерпретировать как документ, написанный на английском языке США, он может быть не совсем корректным на английском языке Великобритании.

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

Если вы определяете схему без targetNamespace, это означает, что соответствующие элементы и атрибуты из XML-документа также должны принадлежать «пространству имен». Использование атрибута noNamespaceSchemaLocation или schemaLocation не обязательно . Таким образом, вы не должны ссылаться на схему в документе XML. В случае, если читатель документа XML должен знать из соответствующего контекста, какую схему вы имеете в виду.

В конце вашего вопроса вы задаете

Не было бы проще, если бы вместо этого экземпляр документа будет просто указать расположение XML-схемы и пусть Xml Schema validator выяснить указана схема или нет целевое пространство?

Но значение атрибута noNamespaceSchemaLocation - это точно путь к файлу XSD, который определяет используемую схему. Значением атрибута schemaLocation является пространство имен и путь к файлу XSD, разделенные пробелом. Таким образом, атрибуты уже делают то, что вы предлагаете.

1 голос
/ 21 октября 2010

Преимущество отдельной схемы (или «словаря» в ваших словах), задающей целевое пространство имен, состоит в том, что оно позволяет схемам повторно использовать схемы из других пространств имен.

Наиболее часто используемая схема - это http://www.w3.org/2001/XMLSchema, которая определяет встроенные типы, такие как xs:int и xs:string. SAML Assertion , например, повторно использует http://www.w3.org/2000/09/xmldsig# и http://www.w3.org/2001/04/xmlenc#.

Было бы очень странно, если бы каждый экземпляр документа определял xs:int в разных пространствах имен. Префикс, такой как xs, может быть указан любым экземпляром, поэтому вы можете назвать его foo:int, если хотите. Но валидатору необходимо знать, что в конечном итоге он разрешается до {http://www.w3.org/2001/XMLSchema}int.

1 голос
/ 21 октября 2010

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

В этом процессе "атрибут schemaLocation "- это всего лишь подсказка, и много раз он вообще не используется.

Рассмотрим следующий сценарий:

  • Я получаю сообщения XML на JMS
  • У меня есть несколько возможных схем, которые могут понадобиться;жесткое кодирование URL-адресов схемы в самих документах XML не работает, так как в этом случае я не могу переместить среду.
  • Процессор использует пространство имен элементов в файле XML, чтобы найти схему в схеме в памятикеш.

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

Надеюсь, это имеет смысл.

...