Проверка XML с помощью XSD в IDE Visual Studio

96

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

У меня есть XML-документ и каталог, полный XSD, которые его определяют. Как мне настроить Visual IDE так, чтобы он уведомлял меня об ошибках проверки, а затем предоставлял intellisense список допустимых тегов и атрибутов в данном контексте?

Что я пробовал:

  • Я добавил XSD в проект вместе с XML-документом.
  • Я добавил XSD в список XML Schema (в пункте меню XML / Schemas ...).
  • Я даже включил атрибуты schemaLocation и noNamespaceSchemaLocation в XML-документ.

Visual Studio по-прежнему не отказывается от полезной информации для отладки или редактирования. Я пробовал и 2010, и 2008 (думал, что делал это раньше, в 2008 году)

Обновление: у меня был другой разработчик, который попробовал это, и он тоже не смог. Он знает, что проделал это с другими XML-документами и заставил это работать. Затем я загрузил редактор XML Oxygen, и он отлично работал с теми же файлами XML и XSD, поэтому файлы кажутся в порядке (или Oxygen более снисходительный / гибкий ...)

Джим МакКит
источник

Ответы:

138

Вам нужно будет связать XML-документ в Visual Studio с имеющимся у вас XSD-файлом.

  1. В окне свойств XML-документа вы должны увидеть что-то вроде этого:

    Свойства XML> Схема

  2. В редакторе набора схем XML (открывается при нажатии на многоточие (...) в текстовом поле «Схемы» в окне свойств) вам необходимо убедиться, что ваша схема присутствует. Кроме того, убедитесь, что Useстолбец для этой схемы включен - если нет, щелкните по нему - вы получите раскрывающийся список параметров, выберите тот, Useкоторый отмечен зеленой галочкой:

    Селектор схемы XML

  3. Убедитесь, что окна списка ошибок Visual Studio отображаются (меню «Просмотр»> «Список ошибок»). Это покажет все несоответствия между определениями схем XML и XSD.

  4. Как только все это будет выполнено, редактор Visual Studio XML должен выделить проблемы с вашим XML в редакторе синими волнистыми линиями:

    Пример ошибки

marc_s
источник
Спасибо, это отличное подробное объяснение, но мое все еще не работает. Я не знал, что вы можете попасть в список схем из таких свойств.
Джим МакКит 01
@ Джим МакКит: что, если вы измените свой XML и снова сохраните его? Иногда для проверки XML требуется триггер, чтобы сработать ...
marc_s
Я принял ваш ответ, хотя у меня он не сработал. Я предполагаю, что моя система была просто залита из шланга, но я переехал на новый компьютер, и теперь все работает нормально.
Джим МакКит
38
@jim Не уверен, что у вас была такая же проблема, но я потратил невероятное количество времени, прежде чем понял, что XML-файл должен быть открыт в редакторе, а фокус должен быть в редакторе, когда вы вызываете окно свойств. Только после этого вы получите свойства «XML-документа», в которых вы можете назначить схему. Если фокус находится в обозревателе решений, в окне «Свойства» отображаются только свойства файла, т.е. назначение схемы там невозможно.
herzbube
2
Я думаю, вам следует добавить результаты @herzbube в сам ответ.
ashish
35

Вам не нужно вручную связывать файлы в Visual Studio - он автоматически сопоставляет файл XML с файлом XSD, если они оба открыты и пространство имен определено правильно.

Чтобы определить пространство имен:

В корневом элементе XML-файла:

<Data xmlns='http://yourdomain.com/yourschema.xsd'>
    ...
</Data>

В элементе схемы файла XSD:

<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://yourdomain.com/yourschema.xsd"
    xmlns:this="http://yourdomain.com/yourschema.xsd"
    elementFormDefault="qualified">
    ...
</xs:schema>

Примечание об использовании типов в вашей схеме, когда у вас есть targetNamespace

Поскольку вы указываете a targetNamespaceв своей схеме, любые ссылки на типы, определенные в схеме, должны иметь префикс пространства имен (именно поэтому мы добавили xmlns:thisатрибут в указанный выше <xs:schema />элемент).

<!-- Define the type as normal -->
<xs:complexType name="Row">
    <xs:sequence>
        <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="Value" type="xs:float" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
</xs:complexType>
<!-- Use the type (note the "this:" prefix) -->
<xs:element name="Row" type="this:Row" minOccurs="0" maxOccurs="unbounded" />
Росс Макнаб
источник
3

Еще одна точка отказа - это "блокирующие" файлы схемы Windows 7 ... щелкните правой кнопкой мыши файл xsd на диске, выберите "Свойства"> "Общие", и если он заблокирован, у вас появится кнопка "Разблокировать". Это приводило к сбою моей проверки XML в VS2012.

EJA
источник
1

Содержит ли ваш xsd атрибут "targetNamespace" /schema/@targetNamespace, похожий на пространство имен, на которое вы ссылаетесь в xml?

Примеры:

XSD :

<xs:schema .... targetNamespace="Datafile.xsd" ... >

XML :

<data xmlns="Datafile.xsd" >...</data>

См. Также: XML / XSD intellisense не работает в Visual Studio 2010

k3b
источник
0

У меня была такая же проблема, но VS уже правильно ссылался на мою схему. Оказывается, файл, который я пытался проверить, не имел расширения xml. Добавил .xml в конец моего имени файла, и проверка начала работать.

Джон Ливермор
источник