Поддержка проверки ключа 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 схемы:

/questions/8355614/xs-klyuch-pochemu-proverka-prohodit-kogda-znachenie-klyucha-ne-yavlyaetsya-chastyu-ssyilki-na-klyuch/8355630#8355630

Функциональность в настоящее время не поддерживается в 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-->
Другие вопросы по тегам