Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как создать валидный XSD для такого XML / 12 сообщений из 12, страница 1 из 1
22.06.2016, 10:38
    #39260168
TRex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
Собственно, есть XML следующего вида:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  <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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
<?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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
<?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 не является валидным по понятным причинам.
Т.е. при попытке
Код: sql
1.
create xml schema collection xsd_test


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

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 и решение существует.

Любые идеи приветствуются!
...
Рейтинг: 0 / 0
22.06.2016, 12:05
    #39260253
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
TRex,

проблема действительно в поверхностных знаниях!
вот тебе видео урок, не пожалей время просмотри его и потом многое проясниться.
YouTube Video
...
Рейтинг: 0 / 0
22.06.2016, 12:30
    #39260283
TRex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
Фридрихвот тебе видео урок

спасибо, обязательно посмотрю.

Фридрихвот тебе примерный шаблон


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

Посмотрите на исходный XML.
Этот xml призван передавать изменения в записях таблиц базы данных.

Т.е. задача максимум, чтобы:

- каждый элемент table с уникальным именем встречалься не больше одного раза
- у каждого элемента были подэлементы row с уникальным(!) набором аттрибутов со строгими типами данных

как-то так...

У вас же кол-во элементов table - unbounded, атрибутов же общее множество и у всех тип string.
...
Рейтинг: 0 / 0
22.06.2016, 14:41
    #39260397
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
авторЯ хочу понять можно ли создать более строгую XSD.Можно создать схему любой степени строгости, хоть регламентирующую этот пример до последней запятой. Весь вопрос в том, насколько строгой она должна быть.
...
Рейтинг: 0 / 0
22.06.2016, 14:48
    #39260399
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
TRex- каждый элемент table с уникальным именем встречалься не больше одного раза<xsd:key>
TRexу каждого элемента были подэлементы row с уникальным(!) набором аттрибутовImpossible
TRexсо строгими типами данныхКакими?

авторЭлемент row, является дочерним к элементу table и может содержать атрибуті таких-то типовВот и все, что Вы можете задать. Структура XML документа, описываемая в XSD не может зависеть от значений каких-либо узлов. Только от их наличия
...
Рейтинг: 0 / 0
22.06.2016, 14:51
    #39260404
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
Antonariy, хоть регламентирующую этот пример до последней запятой.Не получится :)
У товарища, скажем, атрибут с2 содержит "данные" объекта. И он хочет, чтобы, скажем для цвета, там была строка (а в идеале - строковой энумератор), а для рисунка base64. Для документа, по идее, там целочисленный идентификатор
...
Рейтинг: 0 / 0
22.06.2016, 15:12
    #39260424
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<xs:element name="row">
  <xs:complexType>
    <xs:attribute name="a" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string>
          <xs:enumeration value="A"/>
          <xs:enumeration value="U"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="c1" type="xs:integer" use="required"/>
    <xs:attribute name="c11" type="xs:"/>
    <xs:attribute name="c2" type="xs:string"/>
    <xs:attribute name="c3" type="xs:integer"/>
    <xs:attribute name="c5" type="xs:integer"/>
    <xs:attribute name="c6" type="xs:dateTime"/>
    <xs:attribute name="c7" type="xs:integer"/>
    <xs:attribute name="c8" type="xs:dateTime"/>
    <xs:attribute name="c9" type="xs:integer"/>
    <xs:attribute name="p" type="xs:integer" use="required"/>
  </xs:complexType>
</xs:element>

Детальнее о типах здесь https://msdn.microsoft.com/en-us/library/ms256131(v=vs.110).aspx
TRex- каждый элемент table с уникальным именем встречалься не больше одного раза
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="table" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
    <xsd:key name="keyTableName">
      <xsd:selector xpath="table"/>
      <xsd:field xpath="./@name"/>
    </xsd:key>
  </xs:element>

можно еще имя таблицы задать энумератором

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
    <xs:attribute name="name" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string>
          <xs:enumeration value="dbo.Color"/>
          <xs:enumeration value="dbo.Document"/>
          <xs:enumeration value="dbo.ImageObject"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>

или рэгекспом
...
Рейтинг: 0 / 0
22.06.2016, 15:19
    #39260431
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
_Vasilisk_Antonariy, хоть регламентирующую этот пример до последней запятой.Не получится :)
У товарища, скажем, атрибут с2 содержит "данные" объекта. И он хочет, чтобы, скажем для цвета, там была строка (а в идеале - строковой энумератор), а для рисунка base64. Для документа, по идее, там целочисленный идентификаторпод строгостью я подразумеваю соответствие тексту предоставленного документу, а не каким-то формальным правилам, которые автор даже не озвучил.
...
Рейтинг: 0 / 0
22.06.2016, 15:20
    #39260433
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
* документа
...
Рейтинг: 0 / 0
22.06.2016, 15:28
    #39260444
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
TRex,

К слову, Ваша задача решается элегантнейшим способом для такого документа
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  <data>
    <dbo.Color>
      <row a="U" p="33" c1="6009" c2="БАКЛАЖАН" />
      <row a="U" p="37" c1="6004" c2="МОКРЫЙ АСФАЛЬТ" />
    </dbo.Color>
    <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" />
    </dbo.Document>
    <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" />
    </dbo.ImageObject>
  </data>

ну и конечно же создавать схему по данным - это нонсенс. Нужно данные создавать по схеме
...
Рейтинг: 0 / 0
22.06.2016, 17:06
    #39260587
TRex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
Спасибо всем, в особенности _Vasilisk_!

_Vasilisk_TRex,

К слову, Ваша задача решается элегантнейшим способом для такого документа
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  <data>
    <dbo.Color>
      <row a="U" p="33" c1="6009" c2="БАКЛАЖАН" />
      <row a="U" p="37" c1="6004" c2="МОКРЫЙ АСФАЛЬТ" />
    </dbo.Color>
    <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" />
    </dbo.Document>
    <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" />
    </dbo.ImageObject>
  </data>

ну и конечно же создавать схему по данным - это нонсенс. Нужно данные создавать по схеме

Да, я уже пришел к этому выводу - придется изменять сам формат xml, в моем случае это возможно, хотя и накладно. :(
Жаль что исходный формат (из первого поста) не получается типизировать средствами XSD до такой степени, как хотелось бы.
...
Рейтинг: 0 / 0
22.06.2016, 17:17
    #39260598
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать валидный XSD для такого XML
TRexДа, я уже пришел к этому выводу - придется изменять сам формат xml, в моем случае это возможно, хотя и накладно. :(Еще есть вариант XSL.

Кстати, при помощи XSL можно и валидацию проводить
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как создать валидный XSD для такого XML / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]