powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как создать валидный XSD для такого XML
12 сообщений из 12, страница 1 из 1
Как создать валидный XSD для такого XML
    #39260168
TRex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно, есть 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
Как создать валидный XSD для такого XML
    #39260253
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRex,

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

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

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


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

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

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

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

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

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

авторЭлемент row, является дочерним к элементу table и может содержать атрибуті таких-то типовВот и все, что Вы можете задать. Структура XML документа, описываемая в XSD не может зависеть от значений каких-либо узлов. Только от их наличия
...
Рейтинг: 0 / 0
Как создать валидный XSD для такого XML
    #39260404
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, хоть регламентирующую этот пример до последней запятой.Не получится :)
У товарища, скажем, атрибут с2 содержит "данные" объекта. И он хочет, чтобы, скажем для цвета, там была строка (а в идеале - строковой энумератор), а для рисунка base64. Для документа, по идее, там целочисленный идентификатор
...
Рейтинг: 0 / 0
Как создать валидный XSD для такого XML
    #39260424
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как создать валидный XSD для такого XML
    #39260431
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Antonariy, хоть регламентирующую этот пример до последней запятой.Не получится :)
У товарища, скажем, атрибут с2 содержит "данные" объекта. И он хочет, чтобы, скажем для цвета, там была строка (а в идеале - строковой энумератор), а для рисунка base64. Для документа, по идее, там целочисленный идентификаторпод строгостью я подразумеваю соответствие тексту предоставленного документу, а не каким-то формальным правилам, которые автор даже не озвучил.
...
Рейтинг: 0 / 0
Как создать валидный XSD для такого XML
    #39260433
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* документа
...
Рейтинг: 0 / 0
Как создать валидный XSD для такого XML
    #39260444
Фотография _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>

ну и конечно же создавать схему по данным - это нонсенс. Нужно данные создавать по схеме
...
Рейтинг: 0 / 0
Как создать валидный XSD для такого XML
    #39260587
TRex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, в особенности _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
Как создать валидный XSD для такого XML
    #39260598
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRexДа, я уже пришел к этому выводу - придется изменять сам формат xml, в моем случае это возможно, хотя и накладно. :(Еще есть вариант XSL.

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


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