Можно ли объединить явную проверку атрибутов и любой атрибут - PullRequest
0 голосов
/ 06 июня 2011

Можно ли определить в схеме 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.

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

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

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, чтобы убедиться, что добавленный атрибут случайно не проверяется по объявлению глобального атрибута, которое имеет то же имя и, возможно, другой тип.

1 голос
/ 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, проверка не пройдена. Если кто-нибудь знает логику этого, оставьте несколько комментариев, пожалуйста.

...