Какое значение имеют конечные слэши в URI пространства имен? - PullRequest
13 голосов
/ 10 января 2009

Я изучал SOAP и WSDL в рамках подготовки к внедрению веб-сервиса. Одна вещь, с которой я столкнулся, которая озадачивает меня, состоит в том, что некоторые из URI, которые я видел, используют косую черту, такую ​​как:

http://www.w3.org/some-namespace/

в то время как другие примеры, которые я изучал, опускают этот завершающий слеш. У меня действительно есть несколько вопросов по этому поводу:

  • Какое значение имеет косая черта?
  • URI, http://www.w3.org/some-namespace совпадает с http://www.w3.org/some-namespace/?
  • Если они не совпадают, как я могу решить, когда одна форма гарантирована по сравнению с другой?
  • Я прочитал рекомендации, данные w3c относительно URI, и они, по-видимому, указывают на то, что этот URI следует считать равным только в том случае, если сравнение строк URI с учетом регистра считается равным. Правильно ли это толкование?

Ответы [ 3 ]

10 голосов
/ 10 января 2009

Да, правила w3c относительно прочитанных вами URI верны .

Два пространства имен, не имеющие равных строк-uri, являются разными пространствами имен. Даже заглавные буквы и пробелы имеют значение .

Пространство имен-uri не означает, что отправка запроса на него должна приводить к веб-ответу. Поэтому любые рассуждения о том, должно ли оно заканчиваться на "/", не слишком значимы.

Фактически, пространство имен-uri может даже не удовлетворять правилам синтаксиса для URI, и все равно будет служить своей цели для определения пространства имен. Совершенно полезно использовать пространство имен, например, скажем:

"\/^%$#sdhfgds"

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

6 голосов
/ 10 января 2009

URI пространства имен просто подразумеваются как уникальные идентификаторы ( здесь - это ссылка на правила для сравнения). Использование URI (вместо, скажем, «foo») можно проследить (я считаю) до использования URI в XML DOCTYPE.

Что также, я думаю, и вызывает путаницу в отношении "извлекаемости" таких URI. XML Spec требует, чтобы идентификатор SYSTEM в DOCTYPE мог использоваться для извлечения DTD документа (я ссылаюсь на Аннотированный XML Spec, а не на версию W3C, потому что я считаю, что комментарий Тима Брея очень полезен ).

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

Наконец, универсальные идентификаторы ресурсов (URI) - это расширенный набор унифицированных указателей ресурсов (URL). У вас также может быть Унифицированное имя ресурса (URN), и я считаю (но не имею спецификации), что существует третья форма идентификатора.

3 голосов
/ 10 января 2009

Нет, они не одинаковы.

Самым большим отличием было бы формирование относительной мочи от этой базы; с косой чертой относительный ури был бы потомком; без косой черты это был бы брат, т.е. (пример C #):

    Uri uri = new Uri(@"http://www.w3.org/some-namespace/");
    Console.WriteLine(new Uri(uri, "foo")); // http://www.w3.org/some-namespace/foo

    uri = new Uri(@"http://www.w3.org/some-namespace");
    Console.WriteLine(new Uri(uri, "foo")); //http://www.w3.org/foo
...