|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
Доброго времени суток! Подскажите пожалуйста как бы Вы написали 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.
Поставил 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-схемах я новичок, но кое-что уже знаю как настроить PK и FK :). Мне интересно как это делают гуру. Вот к примеру зачем делать столько много комплексных типов? ведь все описание можно указать только в одном элементе Refs? Или я не прав? для сущностей и их коллекций надо делать отдельные элементы, а для свойств скажем так, не надо делать элементы, в моем случае это: Code/Name/Description. Вообщем хочется понять, как правильно составлять самому xsd-схему, и не использовать автогенерацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2012, 17:57 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
GFXВот к примеру зачем делать столько много комплексных типов? ведь все описание можно указать только в одном элементе Refs?Количество комплексных типов от этого не уменьшится. Любое вложение тегов друг в друга описывается комплексным типом. GFXдля сущностей и их коллекций надо делать отдельные элементы, а для свойств скажем так, не надо делать элементы, в моем случае это: Code/Name/Description.Это зависит от логики xml. Здесь она неизвестна или элементарна, то есть ровно то, что написано, поэтому можно написать несколько равноценных вариантов. Элементы Country и Producer можно не объявлять отдельно, а включить в комплексные типы Countries и Producers соответственно. CountryCode можно засунуть в Producer. Еще здесь напрашивается именованный простой тип для Country/Code и Producer/CountryCode поскольку по смыслу это одно и то же. В нем можно задать длину строки и набор символов (например паттерном [A-Z]{3}), чтобы не прошла никакая строка кроме трех заглавных латинских букв. Но опять же, неизвестно, сколько букв там может быть. В общем, как делать правильно, зависит целиком и полностью от логики данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2012, 19:37 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
Кстати не такой уж он огромный и куда более вменяемый, чем генерит 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2012, 19:45 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
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.
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.
указать что проверка происходит только тогда когда есть коллекция объектов Country? P.S. Извиняюсь за мой французский, с терминологией xsd у меня проблемы :) Могу только отличить элемент от атрибута. P.S.S. Вариант который генерит Visual Studio для меня более наглядный, структура xsd похожа на структуру xml-документа. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2012, 11:34 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2012, 13:07 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
Вот как я бы описал ваш xml, учитывая ваши пожелания и свои соображения:Вернее не совсем так, я бы еще засунул тип ProducerCode в недра соответствующего элемента, он же больше никому не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2012, 13:17 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
AntonariyGFXможно ли для этой настройки FK указать что проверка происходит только тогда когда есть коллекция объектов Country?На этот вопрос я ответить не могу, не пользовался ключами.Хотя почему не могу? Это же прямая аналогия с отношениями в БД. Ответ — нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2012, 13:23 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
Antonariy, Спасибо вам за подробное разъяснение и пример! Теперь я знаю как гуру создают xsd-схемы. Более менее стало понятно. Теперь можно не беспокоится за десериализацию xml-документа. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2012, 14:15 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
Да не за что. Стать гуру в xsd совсем не сложно, если осилить этот документ. Это формальное описание xsl. Если вы знаете xsl, то можете посмотреть в этом документе, как работают те или иные фишки. Когда я взялся за xsd, передо мной стояла задача описать язык разметки, чтобы в студии заработал интеллисенс с подсказками при наборе документа, поэтому я использовал описание xsl как шпаргалку. Однако в случае со стандартными языками студия мухлюет. Например, в том же xsd у элемента нельзя указать одновременно name и ref, студия ругается, однако такое правило похоже нельзя описать в xsd. Я специально скачал схему xsd, поменял ей неймспейс и набрал под ней элемент с name и ref — ошибки не возникло. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2012, 14:43 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
GFXуказать что проверка происходит только тогда когда есть коллекция объектов Country?Перевожу в термины БД. Можно ли сделать так, чтобы констрейнт в подчиненной таблице активировался только тогда, когда в мастер-таблице есть данные? Не находите, что требование несколько странное? В чем тогда смысл такого констрейнта? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2012, 15:16 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
AntonariyДа не за что. Стать гуру в xsd совсем не сложно, если осилить этот документ. Это формальное описание xsl. Если вы знаете xsl, то можете посмотреть в этом документе, как работают те или иные фишки. Когда я взялся за xsd, передо мной стояла задача описать язык разметки, чтобы в студии заработал интеллисенс с подсказками при наборе документа, поэтому я использовал описание xsl как шпаргалку. Однако в случае со стандартными языками студия мухлюет. Например, в том же xsd у элемента нельзя указать одновременно name и ref, студия ругается, однако такое правило похоже нельзя описать в xsd. Я специально скачал схему xsd, поменял ей неймспейс и набрал под ней элемент с name и ref — ошибки не возникло. Пока стоит задача только валидировать данные в xml, трансформация будет позже. Видимо когда столкнусь с xsl, тоже буду удивлен его возможностями, как это собственно случилось с xsd. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2012, 19:39 |
|
XSD пример правильного описания
|
|||
---|---|---|---|
#18+
_Vasilisk_GFXуказать что проверка происходит только тогда когда есть коллекция объектов Country?Перевожу в термины БД. Можно ли сделать так, чтобы констрейнт в подчиненной таблице активировался только тогда, когда в мастер-таблице есть данные? Не находите, что требование несколько странное? В чем тогда смысл такого констрейнта? Согласен с вами, требование странное. А смысл заключается в том что xml может содержать список стран, с вот такой настройкой: Код: xml 1.
т.е. в одном документе есть страны а в другом их нет. xsd - в этом случае нормально отвалидирует и тот и другой документ, если нет FK конечно же. Ответ на этот вопрос я получил. Просто я думал может есть какие-то настройки которые позволяют это сделать. К сожалению их нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2012, 19:48 |
|
|
start [/forum/topic.php?fid=14&fpage=20&tid=1332634]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
20ms |
get forum data: |
3ms |
get page messages: |
94ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 205ms |
0 / 0 |