Поддержка проверки ключа IntelliSense для ключа XSD / keyref в Visual Studio 2010 - PullRequest
8 голосов
/ 09 марта 2012

Я искал ответ и не смог его найти:

  • Существует ли поддержка проверки ключа / ключа XSD с помощью Intellisense в Visual Studio 2010?
  • Если так, как заставить это работать?
  • Если нет, есть ли в Visual Studio (встроенный) способ проверки ключа / ссылок в XML, имеющем схему XSD вообще?

Спасибо!

ОБНОВЛЕНИЕ: Обратите внимание, что вопрос не в том, как проверить XML с файлом XSD. Я специально спрашиваю о key / keyref intellisense / любой поддержке в Visual Studio, которая, кажется, вообще не добавляется.

Ответы [ 3 ]

2 голосов
/ 04 сентября 2015

Visual Studio 2012 теперь поддерживает проверку экземпляров XML-документов, на которые распространяются ограничения key / keyref, определенные в ссылочной схеме.

Однако Visual Studio не выдает никаких ошибок для схемысам документ , когда этот документ схемы использует ключ / keyref неправильно - независимо от того, соответствует ли какой-либо документ схеме.

В частности, элементы key / keyref, как определено в схеме , должны использовать пространства имен в операторах селектора xpath, согласно следующему сообщению SO:

https://stackoverflow.com/a/4492004/344638

Цитата:

Более того - это ограничение getcha - keyне распознает пространство имен по умолчанию.Вы всегда должны ставить перед каждой частью селектора xpath префикс пространства имен элемента, который вы ищете.Если у вас нет префикса пространства имен - жесткий, вам нужно добавить его.Это ограничение стандарта.

В следующем посте SO представлен полный пример схемы, использующей key / keyref, экземпляр документа XML и ручной валидатор на основе C #.Схема и экземпляр XML-документа проверяются правильно в Visual Studio - Visual Studio будет генерировать ошибки, если документ нарушает ограничения ключа / keyref схемы:

https://stackoverflow.com/a/2866428/344638

1 голос
/ 07 ноября 2012

Функциональность в настоящее время не поддерживается в VS2010, как и в VS2012 (согласно технической поддержке MS).

Возможно, они будут поддерживать его в будущих версиях ...

0 голосов
/ 09 сентября 2016

Только что попробовал в 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-->
...