Как связать 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"

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


person cwap    schedule 11.04.2009    source источник


Ответы (4)


Попробуйте расположение схемы.

<?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-адресом.

person Peter    schedule 11.04.2009
comment
Если вы работаете в среде, в которой доступ к Интернету заблокирован, схемы не будут загружаться. Кроме того, ваш синтаксис неверен. Это пространство имен‹пространство›расположение‹пространство›пространство имен‹пространство›местоположение... - person John Saunders; 12.04.2009
comment
@Peter Это точно не из W3C. w3schools.com не имеет ничего общего с W3C. - person David Conrad; 12.12.2012
comment
@Джон, это просто копия W3Schools - person Peter; 13.12.2012
comment
@David: правда, я отредактировал id. Хотя в то время они (пока не знаю) утверждали, что они совместимы с W3C. - person Peter; 13.12.2012
comment
URI в верхней части ответа больше недействителен - person mikebabcock; 16.10.2013
comment
Как процессор XML находит файл note.xsd? Где это находится по отношению к w3schools? - person monksy; 18.12.2013

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

person John Saunders    schedule 11.04.2009

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

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

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

person D.Shawley    schedule 11.04.2009

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

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

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

person McDowell    schedule 11.04.2009
comment
@McDowell: Большое спасибо. - person John Saunders; 12.04.2009