Как вы связываете 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 или оно также предоставляет информацию о том, где может быть расположена схема?
Ответы
Ответ 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 является лишь подсказкой и является необязательной. Невозможно проверить произвольный документ.