Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как создать максимально строгий XSD для такого XML  [new]
TRex
Member

Откуда:
Сообщений: 4
Вопрос создавался в ветке по XML, но продублирую еще и здесь :)

Собственно, есть XML следующего вида:

  <data>
    <table name="dbo.Color">
      <row a="U" p="33" c1="6009" c2="БАКЛАЖАН" />
      <row a="U" p="37" c1="6004" c2="МОКРЫЙ АСФАЛЬТ" />
    </table>
    <table name="dbo.Document">
      <row a="I" p="12" c1="283814317" c2="6004" c3="1" c5="123456789" c6="2016-04-06T00:00:00" c7="1111" c8="2016-04-09T00:00:00" c9="1" c11="123456789" />
    </table>
    <table name="dbo.ImageObject">
      <row a="I" p="32" c1="283783957" c2="/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAg2Q==" />
      <row a="I" p="39" c1="283783958" c2="/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAg2Q==" />
      <row a="U" p="40" c1="283783957" />
    </table>
  </data>


Необходимо создать как можно более строгую XSD-схему для него.
Многочисленные онлайн-конверторы генерят излишне гибкую схему, просто перечисляя все возможные атрибуты элемента row для всех элементов table.

Пытаюсь придумать что-то более строгое.
Например, вариант 1, через group:

+
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:group name="groupColor">
		<xsd:sequence>

			<xsd:element name="table" maxOccurs="1">
				<xsd:complexType>
				<xsd:sequence>
					<xsd:element name="row" maxOccurs="unbounded">
						<xsd:complexType>
							<xsd:attribute name="a" use="required" type="xsd:string"/>
							<xsd:attribute name="p" use="required" type="xsd:string"/>
							<xsd:attribute name="c1" use="required" type="xsd:integer"/>
							<xsd:attribute name="c2" use="optional" type="xsd:string"/>
							<xsd:attribute name="c3" use="optional" type="xsd:string"/>
						</xsd:complexType>
					</xsd:element>
				</xsd:sequence>
				<xsd:attribute name="name" fixed="dbo.Color"/>
				</xsd:complexType>
			</xsd:element>

		</xsd:sequence>
    </xsd:group>


    <xsd:group name="groupDocument">
		<xsd:sequence>
			<xsd:element name="table" maxOccurs="1">
				<xsd:complexType>
				<xsd:sequence>
					<xsd:element name="row" maxOccurs="unbounded">
						<xsd:complexType>
							<xsd:attribute name="a" use="required" type="xsd:string"/>
							<xsd:attribute name="p" use="required" type="xsd:string"/>
							<xsd:attribute name="c1" use="required" type="xsd:string"/>
							<xsd:attribute name="c2" use="required" type="xsd:string"/>
							<xsd:attribute name="c3" use="optional" type="xsd:integer"/>
							<xsd:attribute name="c4" use="optional" type="xsd:integer"/>
							<xsd:attribute name="c5" use="optional" type="xsd:integer"/>
							<xsd:attribute name="c6" use="optional" type="xsd:dateTime"/>
							<xsd:attribute name="c7" use="optional" type="xsd:integer"/>
							<xsd:attribute name="c8" use="optional" type="xsd:dateTime"/>
							<xsd:attribute name="c9" use="optional" type="xsd:integer"/>
							<xsd:attribute name="c10" use="optional" type="xsd:integer"/>
							<xsd:attribute name="c11" use="optional" type="xsd:integer"/>
						</xsd:complexType>
					</xsd:element>
				</xsd:sequence>

				<xsd:attribute name="name" fixed="dbo.Document"/>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
		
    </xsd:group>



    <xsd:group name="groupImageObject">
		<xsd:sequence>

			<xsd:element name="table" maxOccurs="1">
				<xsd:complexType>
				<xsd:sequence>
					<xsd:element name="row" maxOccurs="unbounded">
						<xsd:complexType>
							<xsd:attribute name="a" use="required" type="xsd:string"/>
							<xsd:attribute name="p" use="required" type="xsd:string"/>
							<xsd:attribute name="c1" use="required" type="xsd:integer"/>
							<xsd:attribute name="c2" use="optional" type="xsd:base64Binary"/>
						</xsd:complexType>
					</xsd:element>
				</xsd:sequence>
				<xsd:attribute name="name" fixed="dbo.ImageObject"/>
				</xsd:complexType>
			</xsd:element>

		</xsd:sequence>
    </xsd:group>

				<xsd:element name="data">
					<xsd:complexType>
						<xsd:sequence>
								<xsd:group ref="groupColor" minOccurs="0" maxOccurs="1"/>
								<xsd:group ref="groupDocument" minOccurs="0" maxOccurs="1"/>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
</xsd:schema>


Вариант 2, через complexType:

+
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">


	<xsd:complexType name="Color">
		<xsd:sequence>
			<xsd:element name="row" maxOccurs="unbounded">
				<xsd:complexType>
					<xsd:attribute name="a" use="required" type="xsd:string"/>
					<xsd:attribute name="p" use="required" type="xsd:string"/>
					<xsd:attribute name="c1" use="required" type="xsd:integer"/>
					<xsd:attribute name="c2" use="optional" type="xsd:string"/>
					<xsd:attribute name="c3" use="optional" type="xsd:string"/>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
		<xsd:attribute name="name" fixed="dbo.Color"/>
	</xsd:complexType>


	<xsd:complexType name="Document">
		<xsd:sequence>
			<xsd:element name="row" maxOccurs="unbounded">
				<xsd:complexType>
					<xsd:attribute name="a" use="required" type="xsd:string"/>
					<xsd:attribute name="p" use="required" type="xsd:string"/>
					<xsd:attribute name="c1" use="required" type="xsd:string"/>
					<xsd:attribute name="c2" use="required" type="xsd:string"/>
					<xsd:attribute name="c3" use="optional" type="xsd:integer"/>
					<xsd:attribute name="c4" use="optional" type="xsd:integer"/>
					<xsd:attribute name="c5" use="optional" type="xsd:integer"/>
					<xsd:attribute name="c6" use="optional" type="xsd:dateTime"/>
					<xsd:attribute name="c7" use="optional" type="xsd:integer"/>
					<xsd:attribute name="c8" use="optional" type="xsd:dateTime"/>
					<xsd:attribute name="c9" use="optional" type="xsd:integer"/>
					<xsd:attribute name="c10" use="optional" type="xsd:integer"/>
					<xsd:attribute name="c11" use="optional" type="xsd:integer"/>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
		<xsd:attribute name="name" fixed="dbo.Document"/>
	</xsd:complexType>


	<xsd:complexType name="ImageObject">
		<xsd:sequence>
			<xsd:element name="row" maxOccurs="unbounded">
				<xsd:complexType>
					<xsd:attribute name="a" use="required" type="xsd:string"/>
					<xsd:attribute name="p" use="required" type="xsd:string"/>
					<xsd:attribute name="c1" use="required" type="xsd:integer"/>
					<xsd:attribute name="c2" use="optional" type="xsd:base64Binary"/>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
		<xsd:attribute name="name" fixed="dbo.ImageObject"/>
	</xsd:complexType>

				<xsd:element name="data">
					<xsd:complexType>
						<xsd:sequence>
								<xsd:element name="table" type="Color" minOccurs="0" maxOccurs="1"/>
								<xsd:element name="table" type="Document" minOccurs="0" maxOccurs="1"/>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
</xsd:schema>



И в том и в другом случае, XSD не является валидным по понятным причинам.
Т.е. при попытке
create xml schema collection xsd_test as 'my xsd definition here'

получаю ошибку:

Msg 6992, Level 16, State 1, Line 8
The content model of type 'xs-nun(/data/complexType())' contains two elements with the same name 'table' and different types, nullability, or value constraints.


Т.е. ругается на наличие внутри описания sequence двух элементов с одинаковым именем ("table")

Пока больше мыслей нет. Все таки надеюсь, что все упирается в мое поверхностное знание XSD и решение существует.

Любые идеи приветствуются!

Сообщение было отредактировано: 22 июн 16, 11:08
22 июн 16, 10:56    [19321868]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить