Подтвердить что ты не робот

Зачем нам нужно targetNamespace?

Я хотел бы понять цель targetNamespace, которая используется как в XML-схеме, так и в WSDL. На самом деле, чтобы все было просто, позвольте ограничить этот вопрос XML-схемой.

Мне кажется, что я полностью понимаю понятие (простых) пространств имен XML. По соглашению мы используем URI/URL, но мы можем использовать любую строку, которую затем назначаем префикс для повторного использования узлами и атрибутами XML или просто используем пространство имен по умолчанию для области действия. До сих пор, так хорошо?

Теперь вводится XML-схема. По каким-то причинам изобретатели XML Schema считали, что понятия простых пространств имен недостаточно, и им нужно было ввести targetNamespace. Мой вопрос: какое существенное преимущество представляет собой представление targetNamespace, которое не может быть обеспечено обычным пространством имен XML? Если XML-документ ссылается на документ xsd, либо с помощью schemaLocation, либо с помощью оператора import, в любом случае я даю путь к фактическому документу xsd, на который ссылаются. Это то, что однозначно определяет схему, на которую я хочу ссылаться. Если, кроме того, я хочу привязать эту схему к определенному пространству имен в моем справочном документе, почему я должен быть обязан реплицировать точное целевое пространство имен, уже определенное в XML-схеме, на которую я ссылаюсь? Почему я не могу просто переопределить это пространство имен, но я хочу, чтобы в документе XML, в котором это пространство имен будет использоваться для ссылки на этот конкретный документ XML-схемы, который я хочу ссылаться?

Update:

Чтобы привести пример, если в документе экземпляра XML есть следующее:

<p:Person
   xmlns:p="http://contoso.com/People"
   xmlns:v="http://contoso.com/Vehicles"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation=
    "http://contoso.com/schemas/Vehicles
     http://contoso.com/schemas/vehicles.xsd
     http://contoso.com/schemas/People
     http://contoso.com/schemas/people.xsd">
   <name>John</name>
   <age>28</age>
   <height>59</height>
   <v:Vehicle>
      <color>Red</color>
      <wheels>4</wheels>
      <seats>2</seats>
   </v:Vehicle>
</p:Person>

Почему, например, в схеме people.xsd необходимо определить целевое пространство имен, которое "http://contoso.com/schemas/People"? Зачем нам вообще нужно определение targetNamespace в документе xsd? Мне кажется, что все, что вам нужно получить из части пространства имен схемы, уже содержится в документе экземпляра XML. В чем преимущество обеспечения существования targetNamespace с равным значением в документе xsd?

Последующий вопрос Павлу:

Можете ли вы дать мне конкретный пример, где такие "столкновения" между именами элементов xsd становятся очевидными, и это объясняет необходимость в targetNamespace?


Хорошо, вот попытка ответить на мой собственный вопрос. Дайте мне знать, если это кажется вам последовательным. Глядя на примеры на странице, связанной с Павлом, помог мне.

Если мы возьмем пример экземпляра XML в исходном вопросе выше, у нас есть две ссылки на определение элемента транспортного средства. Один из них является явным и видимым в самом документе экземпляра XML, но мы также должны представить, что XML-схема person.xsd ссылается на одно и то же определение транспортного средства как на разрешенный дочерний элемент человека. Если бы мы использовали обычные пространства имен, где каждому документу было разрешено определять собственное пространство имен для транспортного средства, как мы узнаем, что экземпляр XML ссылается на одно и то же определение схемы XML для транспортного средства, как и на man.xsd? Единственный способ - это использовать концепцию пространства имен, которая является более строгой, чем первоначальная простая, и которая должна быть написана точно так же в нескольких документах.

Если бы я не писал это на планшете, я бы представил пример кода, но здесь я просто попытаюсь описать пример, который я имею в виду.

Представьте, что у нас есть два разных определения схемы XML для элемента транспортного средства. location1/vehicles.xsd будет содержать определение, подтверждающее пример из вопроса об этом сообщении (содержащий цвет, колеса и элементы детского элемента), тогда как location2/vehicles.xsd будет содержать совершенно другое определение для элемента транспортного средства (например, с дочерними элементами год, модель и объем). Теперь, если документ экземпляра XML ссылается на схему location1, как это имеет место в примере выше, но person.xsd говорит, что элемент person может содержать дочерний элемент транспортного средства типа, определенного в схеме Location2, а затем без понятия объекта targetNamespace, экземпляр XML будет проверять, даже если он явно не имеет подходящего типа транспортного средства в качестве дочернего элемента его персонального элемента.

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

В этом смысл?

4b9b3361

Ответ 1

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

  • В документе экземпляра вы используете пространства имен XML для идентификации пространства имен, в котором находится элемент или атрибут.
  • В документе схемы вы объявляете элементы и атрибуты, которые будут отображаться в экземплярах. Какое пространство имен указано в них? Для этого используется targetNamespace.
  • Расположение документа схемы и пространство имен - это не одно и то же. Обычно имеется несколько документов .xsd с одним и тем же целевым пространством имен. (Они могут или не могут включать друг друга, но обычно будут включать друг друга.)
  • Документы экземпляра не всегда имеют элемент xsi: schemaLocation, чтобы сообщать парсерам, где искать схемы. Различные методы могут использоваться для указания парсеру, где можно найти соответствующие документы схемы. XSD может быть размещен на локальном диске или на каком-либо веб-адресе, и это не должно влиять на пространство имен элементов в нем.
    • xsi: schemaLocation - это подсказка. Parsers могут найти схему для данного пространства имен в другом месте, что подразумевает, что они должны быть в состоянии знать, для какого пространства имен используется схема.
    • Инструменты, такие как инструменты привязки данных, прекомпилируют схемы и производят код, который распознает действительные документы. Они должны иметь возможность знать пространства имен объявленных элементов.

Я думаю, что вы предполагали, что документ экземпляра может указывать пространство имен элементов и атрибутов, объявленных в каком-либо документе схемы, используя xsi: schemaLocation. Это не работает. Во-первых, синтаксический анализатор может найти другие документы схемы, кроме перечисленных, и должен знать, для какого пространства имен они предназначены. С другой стороны, это затрудняло бы или затрудняло бы рассуждения о схемах: вы не смогли бы взглянуть на схему и знать пространства имен, в которых все принадлежало, потому что это решение будет отложено до тех пор, пока не будет написан экземпляр.

Ответ 2

Q: "По соглашению мы используем URI/URLs, но мы можем использовать любую строку, которая Затем мы назначаем префикс для повторного использования узлами и атрибутами XML или используйте просто пространство имен по умолчанию для области действия."

A: Да, точно.

Q: "По каким-то причинам изобретатели XML-схемы почувствовали понятие простых пространств имен было недостаточно, и им пришлось представить целевое пространство".

A: http://www.liquid-technologies.com/Tutorials/XmlSchemas/XsdTutorial_04.aspx

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

...

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

Разъяснение:

  • Основная цель XML-схем - объявить словари.

  • Эти словари могут быть идентифицированы пространством имен, указанным в атрибуте targetNamespace.

  • Схема (XML-документ) может иметь "пространство имен". "Словарь", который описывает документ, может иметь "targetNamespace".

  • Так же, как XML-схемы обеспечивают более высокий уровень абстракции, чем SGML DTD (исходные архитекторы XML-DTD были достаточными), XML-схема "targetNamespaces" обеспечивает уровень абстракции над "простыми пространствами имен".

'Надеюсь, что поможет

Ответ 3

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

<p:Person
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://localhost:8080/scribble/xml/Person"
        xmlns:v="http://localhost:8080/scribble/xml/Vehicle"
        xsi:schemaLocation="
            http://localhost:8080/scribble/xml/Person
            http://localhost:8080/scribble/xml/person.xsd">
    <name>John</name>
    <age>28</age>
    <height>59</height>
    <v:Vehicle>
        <color>Red</color>
        <wheels>4</wheels>
        <seats>2</seats>
    </v:Vehicle>
</p:Person>

Нет пространства имен по умолчанию, указанного для документа, но p: * и v: * псевдонимы для определенных NS URI. Теперь взгляните на сам документ схемы:

<?xml version="1.0" encoding="UTF-8"?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://localhost:8080/scribble/xml/Person"
    elementFormDefault="qualified"
    xmlns:v="http://localhost:8080/scribble/xml/Vehicle">

    <import
        namespace="http://localhost:8080/scribble/xml/Vehicle"
        schemaLocation="http://localhost:8080/scribble/xml/v.xsd"/>

    <element name="Person">
        <complexType>
            <sequence>
                <element name="name" form="unqualified" type="NCName"/>
                <element name="age" form="unqualified" type="integer"/>
                <element name="height" form="unqualified" type="integer"/>
                <element ref="v:Vehicle"/>
            </sequence>
        </complexType>
    </element>

</schema>

и

<?xml version="1.0" encoding="UTF-8"?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://localhost:8080/scribble/xml/Vehicle"
    elementFormDefault="qualified">

    <element name="Vehicle">
        <complexType>
            <sequence>
                <element name="color" form="unqualified" type="NCName"/>
                <element name="wheels" form="unqualified" type="integer"/>
                <element name="seats" form="unqualified" type="integer"/>
            </sequence>
        </complexType>
    </element>
</schema>

Если вы посмотрите на атрибуты в тегах, пространство имен по умолчанию " http://www.w3.org/2001/XMLSchema" для обоих документов схемы... но targetNamespace - это имя, которое используется как пространство имен с псевдонимом в документе экземпляра.

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

Мне кажется, что полезно подумать об этом, например, о том, чтобы провести вечеринку, где у вас есть список гостей и гостей, носящих теги имен. Подумайте о targetNamespace в документах схемы, таких как имена в гостевом списке. Xmlns, aliased или нет, в документах экземпляра похожи на теги имен для гостей. До тех пор, пока у вас есть список гостей (который чудесным образом включает в себя ксерокопию удостоверения личности, выданного государством), всякий раз, когда вы сталкиваетесь с кем-то, вы можете подтвердить свою личность. Если вы сталкиваетесь с кем-то, носящим тег имени, который не соответствует указанным параметрам, вы можете выдохнуться (то есть выбросить ошибку).

Со схемой/экземплярами у вас есть:

Schemas:

targetNamespace="http://localhost:8080/scribble/xml/Person"
targetNamespace="http://localhost:8080/scribble/xml/Vehicle"

Instance:

xmlns:p="http://localhost:8080/scribble/xml/Person"
xmlns:v="http://localhost:8080/scribble/xml/Vehicle"

Или... любой гость по кличке "v", с которым вы сталкиваетесь в любом месте вечеринки (запрещаете специальные правила, которые говорят иначе), любой этаж дома или на заднем дворе или в бассейне, лучше соответствует описанию для гостя в гостевом списке с именем http://localhost:8080/scribble/xml/Vehicle. или они являются нарушителями.

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

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

Ответ 4

Мне не ясно, что именно вы спрашиваете. Очевидно, что схема может содержать определения компонентов во многих разных пространствах имен, и должен быть некоторый способ сказать: "Это объявление элемента E в пространстве имен N". Дизайнеры XSD решили разработать язык так, чтобы все объявления в одном документе схемы принадлежали одному пространству имен, называемому целевым пространством имен модуля. Его можно было бы упаковать по-разному, но разница была бы очень поверхностной. Что, по вашему мнению, неверно с решением о выравнивании модулей с пространствами имен?