Я хотел бы понять цель targetNamespace как использованную как в XML-схеме, так и в WSDL. На самом деле, чтобы все было просто, давайте ограничимся этим вопросом XML-схемой.Зачем нам нужно targetNamespace?
Мне кажется, что я полностью понимаю понятие (простых) пространств имен 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. В чем преимущество обеспечения существования целевого пространства имен с равным значением в документе xsd?
Последующая деятельность вопрос ответ Павла:
Можете ли вы дать мне конкретный пример, когда такие «столкновения» между именами элементов XSD становится очевидным, и что бы объяснить необходимость TargetNamespace?
Хорошо, вот попытка ответить на мой вопрос. Дайте мне знать, если это кажется вам последовательным. Глядя на примеры на странице, связанной с Павлом, помог мне.
Если мы возьмем пример экземпляра XML в исходном вопросе выше, мы имеем две ссылки на определение элемента транспортного средства. Один из них является явным и видимым в самом документе экземпляра XML, но мы также должны представить, что XML-схема person.xsd ссылается на одно и то же определение транспортного средства как на разрешенный дочерний элемент человека. Если бы мы использовали обычные пространства имен, где каждому документу было разрешено определять собственное пространство имен для транспортного средства, как мы узнаем, что экземпляр XML ссылается на одно и то же определение схемы XML для транспортного средства, как и на man.xsd? Единственный способ - это создать концепцию пространства имен, которое является более строгим, чем первоначальное простое, и которое должно быть написано точно так же в нескольких документах.
Если бы я не писал это на планшете, я бы представил пример кода, но здесь я просто попытаюсь описать пример, который я имею в виду.
Представьте, что у нас есть два разных определения схемы XML для элемента транспортного средства. LOCATION1/транспортных средств.xsd будет содержать определение, подтверждающее пример из вопроса об этом сообщении (содержащем цвет, колеса и элементы детского элемента), тогда как location2/vehicles.xsd будет содержать совершенно другое определение для элемента транспортного средства (например, с дочерними элементами год, модель и объем). Теперь, если документ экземпляра XML ссылается на схему location1, как это имеет место в примере выше, но person.xsd говорит, что элемент person может содержать дочерний элемент транспортного средства типа, определенного в схеме Location2, а затем без понятия объекта targetNamespace, экземпляр XML будет проверять, даже несмотря на то, что он явно не имеет подходящего типа транспортного средства в качестве дочернего элемента его персонального элемента.
Целевые пространства имен затем помогают нам удостовериться, что если два разных документа ссылаются на одну и ту же третью схему XML, они оба находятся на деле, ссылаясь на одну и ту же схему, а не только на схему, содержащую элементы, похожие, но не идентичные один другой ...
В этом смысл?
Пол, спасибо за такой быстрый ответ! Я отправлю следующий вопрос в своем первоначальном вопросе, чтобы держать обсуждение общим и за пределами потока комментариев ... – Student
Есть ли что-то святое о 'XMLSchema-instance'? – CodyBugstein
btw потрясающая ссылка! Это очень хорошо объяснено там – CodyBugstein