Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSD пример правильного описания / 12 сообщений из 12, страница 1 из 1
27.09.2012, 17:57
    #37974943
GFX
GFX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSD пример правильного описания
Доброго времени суток!
Подскажите пожалуйста как бы Вы написали 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
27.09.2012, 19:37
    #37975032
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSD пример правильного описания
GFXВот к примеру зачем делать столько много комплексных типов? ведь все описание можно указать только в одном
элементе Refs?Количество комплексных типов от этого не уменьшится. Любое вложение тегов друг в друга описывается комплексным типом.

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

В общем, как делать правильно, зависит целиком и полностью от логики данных.
...
Рейтинг: 0 / 0
27.09.2012, 19:45
    #37975039
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSD пример правильного описания
Кстати не такой уж он огромный и куда более вменяемый, чем генерит 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
28.09.2012, 11:34
    #37975636
GFX
GFX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSD пример правильного описания
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
28.09.2012, 13:07
    #37975859
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSD пример правильного описания
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
28.09.2012, 13:17
    #37975875
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSD пример правильного описания
Вот как я бы описал ваш xml, учитывая ваши пожелания и свои соображения:Вернее не совсем так, я бы еще засунул тип ProducerCode в недра соответствующего элемента, он же больше никому не нужен.
...
Рейтинг: 0 / 0
28.09.2012, 13:23
    #37975886
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSD пример правильного описания
AntonariyGFXможно ли для этой настройки FK указать что проверка происходит только тогда когда есть коллекция объектов Country?На этот вопрос я ответить не могу, не пользовался ключами.Хотя почему не могу? Это же прямая аналогия с отношениями в БД. Ответ — нельзя.
...
Рейтинг: 0 / 0
28.09.2012, 14:15
    #37975998
GFX
GFX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSD пример правильного описания
Antonariy,

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

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

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

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

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


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

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


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