Можно ли совместить явную проверку атрибутов и anyAttribute

Можно ли определить в XML-схеме, что должны быть какие-то определенные XML-атрибуты, и в то же время я хочу разрешить расширение этого списка в будущем?

Здесь, если у нас есть следующая гипотетическая часть объявления XML:

<xs:element name="MyTypeInstance" type="MyType" />

<xs:complexType name="MyType">
  <xs:attribute name="FirstAttr" type="xs:int" use="required"/>
  <xs:attribute name="SecondAttr" type="xs:string" use="required"/>
</xs:complexType>

Тогда следующий фрагмент XML-документа действителен в соответствии с этой схемой:

<MyType firstAttr="123" secondAttr="abc" />

Я хочу иметь возможность успешно проверить следующий фрагмент XML:

<MyType firstAttr="123" secondAttr="abc" ThirdAttr="some new value" />

Две основные проблемы:

  1. Я не хочу менять XML-схему каждый раз, когда мне нужно ввести какой-то новый атрибут, потому что мы не хотим, чтобы все наши клиенты обновлялись до последней версии нашего программного обеспечения, а некоторые из них не обновляют свои приложения. длительное время;
  2. Я не могу просто использовать anyAttribute в XML-схеме, потому что хочу проверить XML-документ перед работой с ним. Если я укажу только элемент anyAttribute, то я не узнаю, что отсутствуют некоторые обязательные атрибуты. И, насколько я понимаю, XML не позволяет использовать элементы attribute и anyAttribute в схеме (по крайней мере, я не смог заставить такую ​​схему работать с помощью класса .net XmlDocument).

Было бы идеально, если бы можно было указать некоторые атрибуты явно, используя элемент attribute, чтобы я точно знал, что эти атрибуты присутствуют в документе XML, но в то же время я бы позволил расширить документ XML, используя элемент anyAttribute.

Как это сделать?


person Dmitrii Lobanov    schedule 06.06.2011    source источник


Ответы (2)


xs:anyattribute может иметь processContents значение strict, lax или skip, при этом strict является значением по умолчанию.

  • strict: должно быть соответствующее объявление глобального атрибута, и атрибут будет проверяться на соответствие этому объявлению.
  • lax: если есть соответствующее объявление глобального атрибута, проверить атрибут; в противном случае пропустите это
  • skip: не проверять атрибут, даже если есть объявление

Если ваша следующая версия схемы будет выглядеть так

<xs:complexType name="MyType">
  <xs:attribute name="FirstAttr" type="xs:int" use="required" />
  <xs:attribute name="SecondAttr" type="xs:string" use="required" />
  <xs:attribute name="ThirdAttr" type="xs:string" use="required" />
  <xs:anyAttribute processContents="lax" />
</xs:complexType>

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

person xan    schedule 07.06.2011

Хорошо, я решил проблему. Схема может выглядеть так:

<xs:complexType name="MyType">
  <xs:attribute name="FirstAttr" type="xs:int" use="required" />
  <xs:attribute name="SecondAttr" type="xs:string" use="required" />
  <xs:anyAttribute processContents="lax" />
</xs:complexType>

Ключ должен был указать processContents="lax" или processContents="skip". Если опустить настройку processContents на lax или skip, проверка завершится неудачно. Если кто-то знает логику этого, напишите несколько комментариев, пожалуйста.

person Dmitrii Lobanov    schedule 06.06.2011