Я хотел бы понять назначение targetNamespace, которое используется как в XML-схеме, так и в WSDL. На самом деле, для простоты, давайте ограничим этот вопрос схемой XML.
Мне кажется, я полностью понимаю понятие (простых) пространств имен XML. По соглашению мы используем URI / URL, но мы можем использовать любую строку, которую мы затем назначаем префиксу для повторного использования узлами и атрибутами XML, или просто используем в качестве пространства имен по умолчанию для рассматриваемой области. Пока все хорошо?
Теперь вводит XML-схему. По какой-то причине изобретатели XML-схемы сочли, что понятия простых пространств имен недостаточно, и им пришлось ввести targetNamespace. Мой вопрос: какое существенное преимущество приносит targetNamespace, которое не может быть обеспечено обычным пространством имен XML? Если документ XML ссылается на документ xsd, либо с помощью schemaLocation, либо с помощью оператора импорта, в любом случае я даю путь к действительному документу xsd, на который ссылаются. Это то, что однозначно определяет схему, к которой я хочу обратиться. Если, кроме того, я хочу привязать эту схему к определенному пространству имен в моем документе, на который есть ссылки, почему я должен быть обязан воспроизвести точное целевое пространство имен, уже определенное в схеме XML, на которую я ссылаюсь? Почему я не могу просто переопределить это пространство имен, как бы мне ни хотелось в документе XML, в котором это пространство имен будет использоваться для ссылки на тот конкретный документ схемы XML, на который я хочу сослаться?
Обновление:
Чтобы привести пример, если у меня есть следующее в экземпляре документа 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 должна определить targetNamespace, который имеет вид "http://contoso.com/schemas/People"?. Зачем нам вообще нужно определение targetNamespace в документе xsd? Мне кажется, все, что вам нужно получить от части пространства имен в schemaLocation, уже содержится в документ экземпляра XML. В чем заключается преимущество принудительного существования объекта targetNamespace с равным значением в документе xsd?
Дополнительный вопрос к ответу Павла:
Можете ли вы привести конкретный пример, когда такие "столкновения" между именами элементов xsd становятся очевидными и это объясняет необходимость в targetNamespace?
Хорошо, вот попытка ответить на мой собственный вопрос. Дайте мне знать, если это кажется вам последовательным. Мне помогли примеры на странице, на которую ссылается Пол.
Если мы возьмем пример экземпляра XML из исходного вопроса выше, у нас есть две ссылки на определение элемента транспортного средства. Один является явным и видимым в самом документе экземпляра XML, но мы также должны представить, что XML-схема person.xsd снова ссылается на то же определение транспортного средства, что и на разрешенный дочерний элемент person. Если бы мы использовали обычные пространства имен, где каждому документу было разрешено определять свое собственное пространство имен для транспортного средства, как бы мы узнали, что экземпляр XML ссылается на то же определение схемы XML для транспортного средства, что и person.xsd? Единственный способ заключается в применении концепции пространства имен, которая является более строгой, чем первоначальная простая, и которая должна быть написана одинаково для нескольких документов.
Если бы я не писал это на планшете, я бы представил пример кода, но здесь я просто попытаюсь описать пример, который я имею в виду.
Представьте, что у нас есть два разных определения XML-схемы для элемента транспортного средства.location1 / Vehicles.xsd будет содержать определение, которое подтверждает пример из вопроса этого поста (содержит дочерние элементы color, wheel и seat), тогда как location2 / Vehicles.xsd будет содержать совершенно другое определение для элемента Vehicle (скажем,, с дочерними элементами год, модель и объем).Теперь, если экземпляр XML-документа ссылается на схему location1, как в случае с приведенным выше примером, но person.xsd говорит, что элемент person может содержать дочерний элемент транспортного средства типа, определенного в схеме location2, тогда без понятияобъекта targetNamespace, экземпляр XML будет проверяться, даже если у него явно нет нужного типа транспортного средства в качестве дочернего элемента его элемента person.
Целевые пространства имен помогают нам убедиться, что если два разных документассылаются на одну и ту же третью XML-схему, что они на самом деле ссылаются на одну и ту же схему, а не просто на схему, которая содержит элементы, которые похожи, но не идентичны друг другу ...
Имеет ли это какой-то смысл