powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSD пример правильного описания
12 сообщений из 12, страница 1 из 1
XSD пример правильного описания
    #37974943
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток!
Подскажите пожалуйста как бы Вы написали 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.
23.
24.
25.
26.
27.
28.
<?xml version="1.0" encoding="utf-8"?>
<Refs>
  <Countries>
    <Country>      
      <Code>RUS</Code>
      <Name>Россия</Name>
      <Description>Российская федерация</Description>      
    </Country>   
    <Country>      
      <Code>USA</Code>
      <Name>США</Name>
      <Description>Соединенные Штаты Америки</Description>      
    </Country>
  </Countries>
  <Producers>
    <Producer>      
      <Code>P01</Code>
      <Name>Производитель</Name>
      <Description>Дистрибьютор</Description>      
      <CountryCode>RUS</CountryCode>
    </Producer>
    <Producer>      
      <Code>P02</Code>
      <Name>GB Production</Name>      
      <CountryCode>USA</CountryCode>
    </Producer>
  </Producers>  
</Refs>



Поставил Stylus Studio, эта прога по дефолту сформировала такой огромный xsd:
Код: 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.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

	<xsd:element name="Country">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="Code"/>
				<xsd:element ref="Name"/>
				<xsd:element ref="Description"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="Countries">
		<xsd:complexType>
			<xsd:sequence maxOccurs="unbounded">
				<xsd:element ref="Country"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="Description" type="xsd:string">
	</xsd:element>

	<xsd:element name="Code" type="xsd:string">
	</xsd:element>

	<xsd:element name="Name" type="xsd:string">
	</xsd:element>

	<xsd:element name="CountryCode" type="xsd:string">
	</xsd:element>

	<xsd:element name="Producer">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="Code"/>
				<xsd:element ref="Name"/>
				<xsd:sequence minOccurs="0" maxOccurs="1">
					<xsd:element ref="Description"/>
				</xsd:sequence>
				<xsd:element ref="CountryCode"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="Producers">
		<xsd:complexType>
			<xsd:sequence maxOccurs="unbounded">
				<xsd:element ref="Producer"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="Refs">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="Countries"/>
				<xsd:element ref="Producers"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
</xsd:schema>



В xsd-схемах я новичок, но кое-что уже знаю как настроить PK и FK :). Мне интересно как это делают гуру.
Вот к примеру зачем делать столько много комплексных типов? ведь все описание можно указать только в одном
элементе Refs? Или я не прав? для сущностей и их коллекций надо делать отдельные элементы, а для свойств скажем
так, не надо делать элементы, в моем случае это: Code/Name/Description.

Вообщем хочется понять, как правильно составлять самому xsd-схему, и не использовать автогенерацию.
...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37975032
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GFXВот к примеру зачем делать столько много комплексных типов? ведь все описание можно указать только в одном
элементе Refs?Количество комплексных типов от этого не уменьшится. Любое вложение тегов друг в друга описывается комплексным типом.

GFXдля сущностей и их коллекций надо делать отдельные элементы, а для свойств скажем
так, не надо делать элементы, в моем случае это: Code/Name/Description.Это зависит от логики xml. Здесь она неизвестна или элементарна, то есть ровно то, что написано, поэтому можно написать несколько равноценных вариантов. Элементы Country и Producer можно не объявлять отдельно, а включить в комплексные типы Countries и Producers соответственно. CountryCode можно засунуть в Producer. Еще здесь напрашивается именованный простой тип для Country/Code и Producer/CountryCode поскольку по смыслу это одно и то же. В нем можно задать длину строки и набор символов (например паттерном [A-Z]{3}), чтобы не прошла никакая строка кроме трех заглавных латинских букв. Но опять же, неизвестно, сколько букв там может быть.

В общем, как делать правильно, зависит целиком и полностью от логики данных.
...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37975039
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати не такой уж он огромный и куда более вменяемый, чем генерит Visual Studio, например:

Код: 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.
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="Refs">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Countries">
					<xs:complexType>
						<xs:sequence>
							<xs:element maxOccurs="unbounded" name="Country">
								<xs:complexType>
									<xs:sequence>
										<xs:element name="Code" type="xs:string" />
										<xs:element name="Name" type="xs:string" />
										<xs:element name="Description" type="xs:string" />
									</xs:sequence>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="Producers">
					<xs:complexType>
						<xs:sequence>
							<xs:element maxOccurs="unbounded" name="Producer">
								<xs:complexType>
									<xs:sequence>
										<xs:element name="Code" type="xs:string" />
										<xs:element name="Name" type="xs:string" />
										<xs:element minOccurs="0" name="Description" type="xs:string" />
										<xs:element name="CountryCode" type="xs:string" />
									</xs:sequence>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37975636
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyGFXВот к примеру зачем делать столько много комплексных типов? ведь все описание можно указать только в одном
элементе Refs?Количество комплексных типов от этого не уменьшится. Любое вложение тегов друг в друга описывается комплексным типом.

GFXдля сущностей и их коллекций надо делать отдельные элементы, а для свойств скажем
так, не надо делать элементы, в моем случае это: Code/Name/Description.Это зависит от логики xml. Здесь она неизвестна или элементарна, то есть ровно то, что написано, поэтому можно написать несколько равноценных вариантов. Элементы Country и Producer можно не объявлять отдельно, а включить в комплексные типы Countries и Producers соответственно. CountryCode можно засунуть в Producer. Еще здесь напрашивается именованный простой тип для Country/Code и Producer/CountryCode поскольку по смыслу это одно и то же. В нем можно задать длину строки и набор символов (например паттерном [A-Z]{3}), чтобы не прошла никакая строка кроме трех заглавных латинских букв. Но опять же, неизвестно, сколько букв там может быть.

В общем, как делать правильно, зависит целиком и полностью от логики данных.

Спасибо Вам, огромное, вы указали мне правильный путь! :)
Это же как проектирование классов в ООП! Я просто поражен от возможностей xsd/xml!
И вправду зачем отдельно создавать комплексный тип Producer или Country, они ведь
должны быть доступны только в коллекции Producers/Countries(если бы они нужны были в других сущностях, то конечно можно было бы, так сказать область видимости указать для них - глобальную). Так как в моем случае Producer и Country являются наследниками класса BaseRef, то собственно для свойств Code, Name, Description можно создать свои типы, и для свойства CountryCode указать такой же тип как и у Code, это же типа ссылки.

У меня правда возник вопрос по нижеуказанной схеме:

Код: 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.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

	<xsd:element name="References">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="Countries" minOccurs="0">
					<xsd:complexType>
						<xsd:sequence maxOccurs="unbounded">
							<xsd:element name="Country">
								<xsd:complexType>
									<xsd:sequence>
										<xsd:element ref="Code"/>
										<xsd:element ref="Name"/>
										<xsd:element ref="Description" minOccurs="0"/>
									</xsd:sequence>
								</xsd:complexType>
							</xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
				<xsd:element name="Producers" minOccurs="0">
					<xsd:complexType>
						<xsd:sequence maxOccurs="unbounded">
							<xsd:element name="Producer">
								<xsd:complexType>
									<xsd:sequence>
										<xsd:element ref="Code"/>
										<xsd:element ref="Name"/>
										<xsd:element ref="Description" minOccurs="0"/>
										<xsd:element name="CountryCode" type="CodeType"/>
									</xsd:sequence>
								</xsd:complexType>
							</xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
			</xsd:sequence>
		</xsd:complexType>
		<xsd:key name="PK_Country">
			<xsd:selector xpath="./Countries/Country"/>
			<xsd:field xpath="Code"/>
		</xsd:key>
		<xsd:key name="PK_Producer">
			<xsd:selector xpath="./Producers/Producer"/>
			<xsd:field xpath="Code"/>
		</xsd:key>
		<xsd:keyref name="FK_Producer_Country" refer="PK_Country">
			<xsd:selector xpath="./Producers/Producer"/>
			<xsd:field xpath="CountryCode"/>
		</xsd:keyref>
	</xsd:element>

	<xsd:simpleType name="CodeType">
      <xsd:restriction base="xsd:string">
         <xsd:maxLength value="3"></xsd:maxLength>
      </xsd:restriction>
   </xsd:simpleType>

	<xsd:simpleType name="NameType">
      <xsd:restriction base="xsd:string">
         <xsd:maxLength value="50"></xsd:maxLength>
      </xsd:restriction>
   </xsd:simpleType>

   <xsd:simpleType name="DescriptionType">
      <xsd:restriction base="xsd:string">
         <xsd:maxLength value="255"></xsd:maxLength>		 
      </xsd:restriction>
   </xsd:simpleType>

	<xsd:element name="Description" type="DescriptionType">	    
	</xsd:element>

	<xsd:element name="Code" type="CodeType">	
	</xsd:element>

	<xsd:element name="Name" type="NameType">
	</xsd:element>
</xsd:schema>



1. Так как свойство Description не обязательно для заполнения во всех сущностях, можно ли указать в типе DescriptionType-
что оно не обязательно для заполнения, т.е. не повторять minOccurs во всех сущностях где используется это поле (<xsd:element ref="Description" minOccurs="0"/>)?
2. Для всех сущностей я хочу создать PK и FK, но xml-документ не всегда будет содержать коллекцию объектов Country
(<xsd:element name="Countries" minOccurs="0">), можно ли для этой настройки FK:
Код: xml
1.
2.
3.
4.
<xsd:keyref name="FK_Producer_Country" refer="PK_Country">
			<xsd:selector xpath="./Producers/Producer"/>
			<xsd:field xpath="CountryCode"/>
		</xsd:keyref>


указать что проверка происходит только тогда когда есть коллекция объектов Country?

P.S. Извиняюсь за мой французский, с терминологией xsd у меня проблемы :) Могу только отличить элемент от атрибута.
P.S.S. Вариант который генерит Visual Studio для меня более наглядный, структура xsd похожа на структуру xml-документа.
...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37975859
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GFXЭто же как проектирование классов в ООП! Я просто поражен от возможностей xsd/xml!Более того, в xsd есть аналог интерфейсов — element abstract="true". Если в сиквенсе (или чойсе или еще где) указать абстрактный элемент, то в сиквенс войдут все элементы, которые его наследуют.

GFXУ меня правда возник вопрос по нижеуказанной схеме:Для начала, у вас некорректное объявление схемы. По крайней мере с точки зрения Visual Studio. Без указания targetNamespace и xmlns, ссылающихся на одно и то же имя, невозможно использовать именованные типы.

Остальные ошибки смысловые. Элемент Code объявлен отдельно и на него идет ссылка из Country и Producer. Но ведь это же разные коды. С формальной точки зрения правильно именно так, как я сказал ранее. Для Producer/Code по-хорошему нужен отдельный тип с рестрикшеном типа P\d{2}. С Name и Description аналогичная ситуация. Если провести аналогию с ООП, то это совершенно разные свойства, принадлежащие разным классам, хотя и имеющие один простой тип — string(50) и string(255) соответственно.

GFXне повторять minOccurs во всех сущностях где используется это полеТип элемента определяет, что содержится, так сказать, внутри этого элемента, а количество вхождений это свойство типа вышестоящего элемента. Однако в вашем конкретном случае можно сделать финт с помощью group, поскольку одинаковые Name и Description входят в разные элементы.

GFXможно ли для этой настройки FK указать что проверка происходит только тогда когда есть коллекция объектов Country?На этот вопрос я ответить не могу, не пользовался ключами.

Вот как я бы описал ваш xml, учитывая ваши пожелания и свои соображения:
Код: 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.
<xsd:schema 	
	targetNamespace="http://tempuri.org/test"
    xmlns="http://tempuri.org/test"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
	<xsd:element name="References">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="Countries" minOccurs="0">
					<xsd:complexType>
						<xsd:sequence maxOccurs="unbounded">
							<xsd:element name="Country">
								<xsd:complexType>
									<xsd:sequence>
										<xsd:element name="Code" type="CountryCode" />
										<xsd:group ref="NameDescr"/>
									</xsd:sequence>
								</xsd:complexType>
							</xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
				<xsd:element name="Producers" minOccurs="0">
					<xsd:complexType>
						<xsd:sequence maxOccurs="unbounded">
							<xsd:element name="Producer">
								<xsd:complexType>
									<xsd:sequence>
										<xsd:element name="Code" type="ProducerCode" />
										<xsd:group ref="NameDescr"/>
										<xsd:element name="CountryCode" type="CountryCode" />
									</xsd:sequence>
								</xsd:complexType>
							</xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
			</xsd:sequence>
		</xsd:complexType>
		<xsd:key name="PK_Country">
			<xsd:selector xpath="./Countries/Country" />
			<xsd:field xpath="Code" />
		</xsd:key>
		<xsd:key name="PK_Producer">
			<xsd:selector xpath="./Producers/Producer" />
			<xsd:field xpath="Code" />
		</xsd:key>
		<xsd:keyref name="FK_Producer_Country" refer="PK_Country">
			<xsd:selector xpath="./Producers/Producer" />
			<xsd:field xpath="CountryCode" />
		</xsd:keyref>
	</xsd:element>
	
	<xsd:simpleType name="CountryCode">
		<xsd:restriction base="xsd:string">
			<xsd:pattern value="[A-Z]{3}"/>
		</xsd:restriction>
	</xsd:simpleType>
	
	<xsd:simpleType name="ProducerCode">
		<xsd:restriction base="xsd:string">
			<xsd:pattern value="P\d{2}"/>
		</xsd:restriction>
	</xsd:simpleType>
	
	<xsd:group name="NameDescr">
		<xsd:sequence>
			<xsd:element name="Name">
				<xsd:simpleType>
					<xsd:restriction base="xsd:string">
						<xsd:maxLength value="50"></xsd:maxLength>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:element>
			<xsd:element name="Description" minOccurs="0">
				<xsd:simpleType>
					<xsd:restriction base="xsd:string">
						<xsd:maxLength value="255"></xsd:maxLength>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:element>
		</xsd:sequence>
	</xsd:group>
</xsd:schema>

...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37975875
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот как я бы описал ваш xml, учитывая ваши пожелания и свои соображения:Вернее не совсем так, я бы еще засунул тип ProducerCode в недра соответствующего элемента, он же больше никому не нужен.
...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37975886
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyGFXможно ли для этой настройки FK указать что проверка происходит только тогда когда есть коллекция объектов Country?На этот вопрос я ответить не могу, не пользовался ключами.Хотя почему не могу? Это же прямая аналогия с отношениями в БД. Ответ — нельзя.
...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37975998
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Спасибо вам за подробное разъяснение и пример!
Теперь я знаю как гуру создают xsd-схемы. Более менее стало понятно.
Теперь можно не беспокоится за десериализацию xml-документа.
...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37976041
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не за что. Стать гуру в xsd совсем не сложно, если осилить этот документ. Это формальное описание xsl. Если вы знаете xsl, то можете посмотреть в этом документе, как работают те или иные фишки. Когда я взялся за xsd, передо мной стояла задача описать язык разметки, чтобы в студии заработал интеллисенс с подсказками при наборе документа, поэтому я использовал описание xsl как шпаргалку. Однако в случае со стандартными языками студия мухлюет. Например, в том же xsd у элемента нельзя указать одновременно name и ref, студия ругается, однако такое правило похоже нельзя описать в xsd. Я специально скачал схему xsd, поменял ей неймспейс и набрал под ней элемент с name и ref — ошибки не возникло.
...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37977441
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GFXуказать что проверка происходит только тогда когда есть коллекция объектов Country?Перевожу в термины БД. Можно ли сделать так, чтобы констрейнт в подчиненной таблице активировался только тогда, когда в мастер-таблице есть данные?

Не находите, что требование несколько странное? В чем тогда смысл такого констрейнта?
...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37984411
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДа не за что. Стать гуру в xsd совсем не сложно, если осилить этот документ. Это формальное описание xsl. Если вы знаете xsl, то можете посмотреть в этом документе, как работают те или иные фишки. Когда я взялся за xsd, передо мной стояла задача описать язык разметки, чтобы в студии заработал интеллисенс с подсказками при наборе документа, поэтому я использовал описание xsl как шпаргалку. Однако в случае со стандартными языками студия мухлюет. Например, в том же xsd у элемента нельзя указать одновременно name и ref, студия ругается, однако такое правило похоже нельзя описать в xsd. Я специально скачал схему xsd, поменял ей неймспейс и набрал под ней элемент с name и ref — ошибки не возникло.

Пока стоит задача только валидировать данные в xml, трансформация будет позже.
Видимо когда столкнусь с xsl, тоже буду удивлен его возможностями, как это собственно случилось
с xsd.
...
Рейтинг: 0 / 0
XSD пример правильного описания
    #37984423
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_GFXуказать что проверка происходит только тогда когда есть коллекция объектов Country?Перевожу в термины БД. Можно ли сделать так, чтобы констрейнт в подчиненной таблице активировался только тогда, когда в мастер-таблице есть данные?

Не находите, что требование несколько странное? В чем тогда смысл такого констрейнта?

Согласен с вами, требование странное.
А смысл заключается в том что xml может содержать список стран, с вот такой настройкой:
Код: xml
1.
<xsd:element name="Countries" maxOccurs="0">


т.е. в одном документе есть страны а в другом их нет. xsd - в этом случае нормально отвалидирует
и тот и другой документ, если нет FK конечно же.

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


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