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

Как вы связываете XML с XSD?

Интересно, как мы используем -declaration для привязки XML к DTD, как мы это делаем с XSD?

Пример MSDN:

<?xml version="1.0"?>
<Product ProductID="123" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="Product.xsd">
    <ProductName>Rugby jersey</ProductName>
</Product> 

это xsi: NoNamespaceSchemaLocation, который делает трюк? Или это просто другое пространство имен?

[EDIT] И есть

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

.. строка только для того, чтобы предоставить нам уникальное пространство имен XML или оно также предоставляет информацию о том, где может быть расположена схема?

4b9b3361

Ответ 1

Попробуйте schemaLocation.

<?xml version="1.0"?>

<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

noNamespaceSchemaLocation отличается. Обратите внимание, что оба они действительно только "намеки" в теории, для потребителя XML-документа. Я никогда не сталкивался с процессором xml, который не следил за ними; в конце концов, это рекомендация W3C. см. http://www.w3.org/TR/xmlschema-1/

Но действительно, это может пойти не так, как здесь, но опять же, он считал ошибку по какой-то причине.

Короче: я просто доверяю этому, без вреда: -)

Я не думаю, что любой полупристойный процессор xml может игнорировать этот "намек" в наши дни.

URL-адреса всегда для уникальности, но в некоторых случаях информация будет предоставлена ​​по URL-адресу.

Ответ 2

xsi: noNamespaceSchemaLocation и xsi: schemaLocation предоставляют подсказки для XML-процессоров, которые решают соблюдать эти рекомендации. Но это лишь намеки. Они не обязательно заставляют ваш документ проверять схему.

Ответ 3

Я вообще просто включаю пространство имен и ожидаю, что если кто-то обрабатывает его, он должен его проверить, тогда они получат схему и настроят свою среду обработки, чтобы она могла найти XSD. Я имел ограниченный успех с xsi:schemaLocation и такими атрибутами. Большинство проблем обычно сосредоточено на поиске самого файла XSD. Некоторые процессоры хотят, чтобы путь был включен, что очень забавно, если XSD находится в файловой системе вместо веб-сервера.

Кажется, что каждый процессор реализует поиск немного по-другому. Некоторые используют отдельные объекты каталога схемы, другие требуют загрузки и присоединения схем отдельно. Если вы не предоставляете код для обработки документов, вам лучше не включать xsi:schemaLocation или xsi:noNamespaceSchemaLocation IMHO. Единственное, что может сделать их включение, - это подколять кого-нибудь, кто обрабатывает ваш документ, либо размещая схему в том же месте, либо обнаружив какой-то способ, чтобы их выбранный процессор игнорировал или обходил определение местоположения.

В качестве основной заметки самая большая проблема, с которой я столкнулся, была на самом деле с DTD, которые были указаны с помощью объявления SYSTEM, которое ссылалось на "c:\somepath\doc.dtd". Проблема заключалась в том, что я обрабатывал документы в окне FreeBSD. Я закончил писать свой собственный резольвер, чтобы сопоставить пути стиля Windows к локальной файловой системе, так как я не мог самостоятельно изменять сами документы и должен был их проверить.

Ответ 4

Это не глупый вопрос, но Джон Сондерс прав.

так же, как мы используем -decleration для привязки XML к DTD, как мы это делаем с XSD?

Вот суть проблемы - вы не можете. Одна из проблем подхода DTD заключалась в том, что в документе указан механизм проверки, а не потребитель документа. Post-DTD, вы можете взять XML-документ и проверить его с помощью XSD или RELAX NG или какого-либо другого механизма - они развязаны (по крайней мере теоретически). Любая ссылка XSD является лишь подсказкой и является необязательной. Невозможно проверить произвольный документ.