Поддержка проверки ключа IntelliSense для ключа XSD /keyref в Visual Studio 2010
Я искал ответ и не смог найти:
- Существует ли поддержка проверки ключа / ключа XSD через Intellisense в Visual Studio 2010?
- Если так, как заставить это работать?
- Если нет, есть ли в Visual Studio (встроенный) способ проверки ключа / ссылок в XML, имеющем схему XSD?
Спасибо!
ОБНОВЛЕНИЕ: Обратите внимание, что вопрос не в том, как проверить XML с файлом XSD. Я спрашиваю конкретно о ключе /keyref intellisense/ любой поддержке в Visual Studio, которая, кажется, вообще не добавляется.
3 ответа
Visual Studio 2012 теперь поддерживает проверку экземпляров XML-документов, на которые распространяются ограничения key / keyref, как определено в ссылочной схеме.
Однако Visual Studio не выдает никаких ошибок для самого документа схемы, когда этот документ схемы использует ключ / keyref неправильно - независимо от того, соответствует ли какой-либо документ схеме.
В частности, элементы key / keyref, определенные в схеме, должны использовать пространства имен в операторах селектора xpath, согласно следующему сообщению SO:
/questions/2425705/klyuch-xml-schema-keyref-kak-ih-ispolzovat/2425735#2425735
Цитировать:
Кроме того, это - проблема с ключом - ключи не распознают пространство имен по умолчанию. Вы всегда должны ставить перед каждой частью селектора xpath префикс пространства имен элемента, который вы ищете. Если у вас нет префикса пространства имен - жесткий, вам нужно добавить его. Это ограничение стандарта.
В следующем сообщении SO представлен полный пример схемы, использующей key / keyref, экземпляр документа XML и ручной валидатор на основе C#. Схема и экземпляр документа XML проверяются корректно в Visual Studio - Visual Studio будет генерировать ошибки, если документ нарушает ограничения ключа / keyref схемы:
Функциональность в настоящее время не поддерживается в VS2010, как и в VS2012 (согласно технической поддержке MS).
Возможно они поддержат это в будущих версиях...
Только что попробовал в VS 2013 и VS 2015. Теперь они подтвердили ключ /refkey. Это показало предупреждения на родительском уровне все же.
Но, как сказал @antiduh, они все еще не проверяют файл xsd. Так что вам действительно нужно убедиться, что ключ /refkey в xsd верен.
Потребовались мои часы, чтобы выяснить простой образец. Даже образец на MSDN не работает. Мне пришлось немного его изменить.
Во-первых, убедитесь, что вы знаете, как позволить Visual Studio проверять xml на xsd по вашему выбору.
Затем используйте следующий пример xsd и xml для проверки ключа /refkey. Помните, что предупреждение касается закрытия корневого элемента, а не элемента, который нарушает правило key / ref.
Файл xsd выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="namespace1"
xmlns:r="namespace1"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="A" type="r:A" maxOccurs="unbounded"/>
<xs:element name="B" type="r:B"/>
</xs:sequence>
</xs:complexType>
<xs:keyref name="dummy" refer="r:pNumKey">
<xs:selector xpath="r:A/r:part"/>
<xs:field xpath="@ref-number"/>
</xs:keyref>
<xs:key name="pNumKey">
<xs:selector xpath="r:B/r:part"/>
<xs:field xpath="@key-number"/>
</xs:key>
</xs:element>
<xs:complexType name="A">
<xs:sequence>
<xs:element name="part" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="ref-number" type="xs:integer"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="B">
<xs:sequence>
<xs:element name="part" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="key-number" type="xs:integer"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
И XML-файл выглядит так:
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="namespace1">
<A>
<!-- if the ref-number is equal to one of the key-number, the validation will pass -->
<part ref-number="1"/>
</A>
<A>
<!-- if the ref-number is not equal to one of the key-number, the validation will give error -->
<part ref-number="5"/>
</A>
<B>
<part key-number="1"/>
<part key-number="2"/>
<part key-number="3"/>
</B>
</root><!--you will see warnings here-->