Как вы связываете 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, которая делает трюк? Или это просто другое пространство имен?

[Редактировать] И это

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

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

4 ответа

Решение

Попробуйте 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.

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

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

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

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

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

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

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

Другие вопросы по тегам