Добрый день. Имеется xml-файл настроек. Работать с ним хотелось бы через GUI, а не править xml вручную каждый раз... Извлекаю из него данные посредством XElement.Load. Хочу под каждый тип, который присутствует у меня в xml, написать свой шаблон, но пока не додумался, как это сделать, ведь по сути это всё XElement'ы, а в шаблоне нельзя (насколько я знаю) указать фильтр (мол это шаблон только для такого XElement, у которого имя Address). Можно, конечно, написать IValueConverter для XElement и в нём реализовать огромный блок switch/case, но... Как-то не нравится мне этот подход. Есть ли способ назначить шаблон для различных XElement, различая их между собой по имени и не используя при этом один конвертер на всех с реализованным в нём switch/case? Файл, над которым колдую такой:
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. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208.
<?xml version="1.0" encoding="utf-8"?>
<!--Общий конфигурационный файл Системы. Уровень настроек: ВСЕ ПОЛЬЗОВАТЕЛИ ДОМЕНА.-->
<CommonSettings SystemName="OpenCAD">
<!--Блок общей информации о компании-->
<CompanyInfo>
<!--Сокращённое наименование организации-->
<CompanyShortName>GPSM</CompanyShortName>
<!--Полное наименование организации-->
<CompanyName>ЗАО Институт Гипростроймост-Санкт-Петербург</CompanyName>
<!--Физический адрес организации-->
<Address>"Институт Гипростроймост - Санкт-Петербург", Российская Федерация, 197198 , Санкт-Петербург, ул. Яблочкова, 7Л</Address>
<!--Логотип компании-->
<LogotypeImage>%XmlPath.ServerDir%\Common\Settings\gpsm_logo.gif</LogotypeImage>
<!--Контактные телефоны-->
<Phones>
<Phone Name="Канцелярия" Number="+7 (812) 233-96-66"/>
<Phone Name="Приёмная" Number="+7 (812) 498-08-14"/>
</Phones>
<!--Факсы-->
<Faxes>
<Fax Name="Факс канцелярии" Number="+7 (812) 233-96-66"/>
</Faxes>
<!--Сайт компании-->
<Site>http://www.gpsm.ru/</Site>
<!--Электронная почта-->
<Emails>
<Email Name="Секретари" Value="тынц@тынц.ru"/>
</Emails>
</CompanyInfo>
<!--Информация, необходимая для идентификации администратора CAD, руководителей групп проектирования, а так же для предоставления пользователям информации о том, как связаться с администратором CAD-->
<Identification>
<!--Имя домена-->
<DomainName>hyprostroy</DomainName>
<!--Имя доменной группы, в состав которой входят ТОЛЬКО руководители групп проектирования-->
<TeamGroupName>ГИП</TeamGroupName>
<!--Контактная информация об администраторе CAD (для пользователей Системы)-->
<CadAdminInfo>
<!--Логин администратора CAD-->
<AdminCadLogin>developer</AdminCadLogin>
<!--Имя-->
<Name>Девелопер</Name>
<!--Отчество-->
<MiddleName>Девелоперович</MiddleName>
<!--Фамилия-->
<Surname>Девелоперов</Surname>
<!--Внутренний контактный телефон-->
<Phone> 240 </Phone>
<!--Номер кабинета-->
<CabinetNumber> 206 </CabinetNumber>
<!--Если значение элемента Email обособлено символами '%' - оно должно искаться в блоке 'Contacts' по значению поля 'Key'.-->
<Email>%Cad.Admin%</Email>
<!--Примечание для пользователей-->
<Notes>
Прежде чем обратиться с проблемой, пожалуйста убедитесь в том, что её решение ещё не было опубликовано в нашем HelpDesk: http://dump/HelpDesk/AppPages/KnowledgeBaseManager.aspx
</Notes>
</CadAdminInfo>
</Identification>
<!--Контактная информация для возможности отправления электронных сообщений-->
<Contacts Host="192.168.123.90" Port="25">
<!--Связь с администратором САПР-->
<Contact Key="CAD.Admin" E-mail="дык@дык.ru" AllowSend="true"/>
<!--Адрес, на который следует отправлять отчёты об ошибках, возникших в процессе работы системы-->
<Contact Key="ErrorReports" E-mail="дык@дык.ru" AllowSend="true"/>
<!--Адрес, на который следует отправлять отчёты, запрашиваемые администратором САПР-->
<Contact Key="WorkReports" E-mail="дык@дык.ru" AllowSend="true"/>
</Contacts>
<Sites>
<!--Сетевая справка о Системе-->
<Site Key="System.CAD.Help" Address="http://dump/default.aspx"/>
<!--Сетевая справка стандарта предприятия по работе с САПР-->
<Site Key="AcadStandardHelp" Address="http://dump/default.aspx"/>
<!--Сетевой адрес обучающих видеоуроков-->
<Site Key="AcadLessons" Address="http://dump/default.aspx"/>
</Sites>
<!--Версии AutoCAD, для которых допускается использование данной Системы-->
<AllowedAutoCADs DefaultVersion="17.2">
<Acad Version="17.2" Platform="x86"/>
<Acad Version="17.2" Platform="x64"/>
<Acad Version="18.0" Platform="x86"/>
<Acad Version="18.0" Platform="x64"/>
<Acad Version="18.1" Platform="x86"/>
<Acad Version="18.1" Platform="x64"/>
<Acad Version="18.2" Platform="x86"/>
<Acad Version="18.2" Platform="x64"/>
</AllowedAutoCADs>
<!--Соглашения по расширениям xml-файлов, использующихся в Системе. Файлы, чьё расширение совпадает с одним из перечисленных в блоке Extentions - являются ЗАШИФРОВАННЫМИ xml-файлами.-->
<Extentions>
<!--Расширение для xml-файлов настроек (settings files)-->
<XmlSettingsFiles>set</XmlSettingsFiles>
<!--Расширение для xml-файлов данных (data files). В качестве данных могут выступать, к примеру, таблицы различных сортаментов.-->
<XmlDataFiles>dat</XmlDataFiles>
<!--Расширение для xml-файлов, в которых содержится информация, согласно которой строится графический интерфейс (Custom User Interface) - меню, панели, вкладки и т.п.-->
<XmlCuiFiles>cui</XmlCuiFiles>
<!--Расширение для xml-файлов, в которых описано содержимое различных каталогов (Directory Contents)-->
<XmlDirectoryContents>dcn</XmlDirectoryContents>
<!--Расширение для xml-файлов сценариев обновлений (Tasks)-->
<XmlTasks>tsk</XmlTasks>
</Extentions>
<!--Различного рода текстовые значения, которые применяются при формировании имён различного рода файлов-->
<Names>
<!--Имя файла общих настроек уровня домена-->
<CommonSettingsFileName>CommonSettings</CommonSettingsFileName>
<!--Имя файла ключа шифрования/дешифровки-->
<KeyFileName>Key</KeyFileName>
<!--Имя файла настроек плагина (без указания расширения)-->
<PlaginSettingsFileName>Settings</PlaginSettingsFileName>
<!--Имя файла настроек пользователя-->
<UserSettingsFileName>UserSettings</UserSettingsFileName>
</Names>
<!--Информация о размещении каталогов с разного рода ресурсами представлена в блоке 'DirectoriesInfo' набором строковых переменных, которые могут использоваться в программе. Имя переменной указывается в атрибуте 'Key'. Для того, чтобы использовать имя переменной в составе строки, это имя следует обосабливать символом '%'.
Внимание! Помимо указанных в блоке 'DirectoriesInfo' переменных, автоматически вычисляется значение ряда следующих переменных (они так же войдут в словарь):
1. 'Xml.AcadVersion' - версия AutoCAD.
2. 'Xml.Platform' - версия платформы (x86 или x64).
3. 'Xml.SystemName' - имя СИСТЕМЫ, записанное в атрибуте 'SystemName' корневого элемента данного xml-файла настроек.
-->
<DirectoriesInfo>
<!--Каталог (полный путь) к основному каталогу Системы, размещённому на сервере-->
<DirectoryInfo Key="XmlPath.ServerDir" Path="D:\SERVER\%Xml.SystemName%"/>
<!--Каталог (полный путь) Системы на локальной машине-->
<DirectoryInfo Key="XmlPath.LocalCommonDir" Path="D:\%Xml.SystemName%"/>
<!--Каталог (полный путь) в профиле пользователя-->
<DirectoryInfo Key="XmlPath.UserDir" Path="%Process.AppData%\%Xml.SystemName%"/>
<!--Каталог, в котором хранятся CUI-файлы (файлы меню AutoCAD)-->
<DirectoryInfo Key="XmlPath.CUI" Path="%XmlPath.LocalCommonDir%\dep\%Xml.AcadVersion%\etc\CUI"/>
<!--Каталог, в котором на сервере находятся оригиналы файлов настроек-->
<DirectoryInfo Key="XmlPath.ServerConfig" Path="%XmlPath.ServerDir%\Settings"/>
<!--Каталог, в котором находятся локальные копии файлов настроек-->
<DirectoryInfo Key="XmlPath.LocalConfig" Path="%XmlPath.LocalCommonDir%\Settings"/>
<!--Каталог, в котором находятся подкаталоги с настройками уровня доменных групп-->
<DirectoryInfo Key="XmlPath.GroupSettings" Path="%XmlPath.LocalConfig%\GroupSettings"/>
<!--Каталог, в котором хранятся журналы хеширования СЕРВЕРНЫХ каталогов (эти журналы создаёт администратор CAD и они хранятся на сервере).-->
<DirectoryInfo Key="XmlPath.ServerDirectoryContents" Path="%XmlPath.ServerDir%\dircont"/>
<!--Каталог, в котором хранятся журналы хеширования ЛОКАЛЬНЫХ каталогов-->
<DirectoryInfo Key="XmlPath.LocalDirectoryContents" Path="%XmlPath.LocalCommonDir%\update\dircont"/>
<!--Каталог, в котором хранятся ЕЩЁ НЕ ВЫПОЛНЕННЫЕ сценарии синхронизации каталогов-->
<DirectoryInfo Key="XmlPath.LocalUpdateTasks" Path="%XmlPath.LocalCommonDir%\update\tasks"/>
<!--Каталог, в котором хранятся отработанные сценарии синхронизации каталогов (если администратор CAD даст команду записывать их туда)-->
<DirectoryInfo Key="XmlPath.LocalExecutedTasks" Path="%XmlPath.LocalUpdateTasks%\update\history"/>
<!--Каталог, в котором на сервере хранится версия синхронизатора, соответствующая текущей разрядности операционной системы-->
<DirectoryInfo Key="XmlPath.ServerSynchronizer" Path="%XmlPath.ServerDir%\tools\bin\%Xml.Platform%\Synchronizer"/>
<!--Каталог, в котором на локальном компьютере хранится синхронизатор-->
<DirectoryInfo Key="XmlPath.LocalSynchronizer" Path="%XmlPath.LocalCommonDir%\tools\Synchronizer"/>
<!--Каталог, в котором на сервере находится версия менеджера генерации журналов и сценариев обновлений, соответствующая текущей разрядности операционной системы-->
<DirectoryInfo Key="XmlPath.ServerTaskWriter" Path="%XmlPath.ServerDir%\tools\bin\%Xml.Platform%\TaskWriter"/>
<!--Каталог, в котором на локальной машине находится менеджер генерации журналов и сценариев обновлений-->
<DirectoryInfo Key="XmlPath.LocalTaskWriter" Path="%XmlPath.LocalCommonDir%\tools\TaskWriter"/>
<!--Каталог, в котором на сервере хранится версия ослика, соответствующая текущей разрядности операционной системы-->
<DirectoryInfo Key="XmlPath.ServerBurro" Path="%XmlPath.ServerDir%\tools\bin\%Xml.Platform%\Burro"/>
<!--Каталог, в котором на локальном компьютере хранится ослик-->
<DirectoryInfo Key="XmlPath.LocalBurro" Path="%XmlPath.LocalCommonDir%\tools\Burro"/>
<!--Каталог, являющийся локальным репозиторием плагинов (не lisp), которые разрешено загружать в AutoCAD-->
<DirectoryInfo Key="XmlPath.LocalRepository" Path="%XmlPath.LocalCommonDir%\dep\%XmlPath.AcadVersion\bin%"/>
<!--Каталог, являющийся локальным репозиторием lisp-плагинов, которые разрешено загружать в AutoCAD-->
<DirectoryInfo Key="XmlPath.LocalRepository2" Path="%XmlPath.LocalCommonDir%\lisp"/>
</DirectoriesInfo>
<!--Правила фильтрации, согласно которым должны выбираться или исключаться каталоги и файлы в процессе формирования журналов и задач обновлений. Правила формируются в виде РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ-->
<RegexRules>
<!--Правило, согласно которому должна указываться версия AutoCAD-->
<RegexRule Key="versionRule" Rule="^[0-9]{2}\.[0-9]{1}$"/>
<!--Правило, согласно которому должно определяться наличие указания версии AutoCAD в пути к каталогу или файлу-->
<RegexRule Key="dirHasVersion" Rule="\\[0-9]{2}\.[0-9]{1}(\\|$)"/>
<!--Правило, согласно которому исходный код программ, справочная информация и обучающее видео должны оставаться на сервере (не копироваться на локальную машину). Кроме того - три программы (Burro, CryptoEditor и Synchronizer), которые собственно и выполняют синхронизацию - сами не могут сами себя синхронизировать (да это и не нужно, т.к. они обновляют друг друга автоматически).-->
<RegexRule Key="excludeFolders-1" Rule="^(Sources|Help|Video|Burro|CryptoEditor|Synchronizer)$"/>
<!--Отладочные файлы MS Visual Studio-->
<RegexRule Key="excludeFiles-1" Rule="\.pdb$"/>
</RegexRules>
<!--Каталоги, синхронизацию которых необходимо выполнять-->
<SynchronizationTasks>
<!--Каталог, в котором находятся плагины (кроме тех, что написаны на AutoLisp/VisualLisp), специфичные для конкретной версии AutoCAD (с учётом разрядности операционной системы)-->
<Task SourceDirectory="%XmlPath.ServerDir%\dep\%XmlPath.AcadVersion%\bin\%Xml.Platform%" TargetDirectory="%XmlPath.LocalCommonDir%\dep\%XmlPath.AcadVersion%\bin" DirExcludeRuleKey="excludeFolders-1" FileExcludeRuleKey="excludeFiles-1"/>
<!--Каталог, в котором находятся различного рода данные, специфичные для конкретной версии AutoCAD-->
<Task SourceDirectory="%XmlPath.ServerDir%\dep\%XmlPath.AcadVersion%\etc" TargetDirectory="%XmlPath.LocalCommonDir%\dep\%XmlPath.AcadVersion%\etc%"/>
<!--Каталог, в котором находятся плагины, AutoCAD, написанные на AutoLisp/VisualLisp-->
<Task SourceDirectory="%XmlPath.ServerDir%\lisp\bin" TargetDirectory="%XmlPath.LocalCommonDir%\lisp"/>
<!--Каталог, в котором содержатся данные, используемые в любой версии AutoCAD-->
<Task SourceDirectory="%XmlPath.ServerDir%\undep" TargetDirectory="%XmlPath.LocalCommonDir%\undep"/>
<!--Каталог, в котором содержатся настройки уровня доменных групп-->
<Task SourceDirectory="%XmlPath.ServerDir%\Settings\GroupSettings" TargetDirectory="%XmlPath.LocalCommonDir%\Settings\GroupSettings"/>
<!--Каталог, в котором содержатся общие приложения Системы-->
<Task SourceDirectory="%XmlPath.ServerDir%\tools\bin\%Xml.Platform%" TargetDirectory="%XmlPath.LocalCommonDir%\tools" DirExcludeRuleKey="excludeFolders-1" FileExcludeRuleKey="excludeFiles-1"/>
</SynchronizationTasks>
<!--Перечень фильтров, согласно которым должны выбираться файлы плагинов для их загрузки в AutoCAD всем пользователям домена-->
<LoadingFilters AllowUseGroupFilters="true" AllowUseUserFilters="true">
<!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью ObjectARX-->
<ARX AllowLoad="true">
<!--Атрибут 'Directory' содержит путь к каталогу, в котором должен осуществляться поиск файлов. В имени каталога можно использовать имена переменных, которые
определены в составе файла 'CommonSettings.xset' в блоке 'DirectoriesInfo'. Имена переменных следует заключать между двумя символами '%'.
В атрибуте 'IncludeFilters' указываются фильтры, на основании которых производится отбор нужных библиотек. Между собой фильтры следует разделять символом ';'.
Атрибут 'ExcludeFilters' (является необязательным) содержит перечень фильтров (разделённых символом ';'), с помощью которых отфильтровываются не нужные файлы из набора, полученного на основе фильтров, указанных в атрибуте 'IncludeFilters'.
Внимание: фильтры, указываемые в атрибутах 'IncludeFilters' и 'ExcludeFilters' - НЕ ЯВЛЯЮТСЯ РЕГУЛЯРНЫМИ ВЫРАЖЕНИЯМИ!
Атрибут 'Recursion' указывает, следует ли выполнять рекурсивный поиск по дочерним каталогам.
Атрибут 'AllowUse' указывает, следует ли обрабатывать данный элемент 'LoadingFilter'. Элементов 'LoadingFilter' может быть сколько угодно.-->
<LoadingFilter Directory="%XmlPath.LocalRepository%\bin\ARX" IncludeFilters="*.arx" ExcludeFilters="" Recursion="true" AllowUse="true"/>
</ARX>
<!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью .Net API AutoCAD-->
<NET AllowLoad="true">
<LoadingFilter Directory="%XmlPath.LocalRepository%\bin\Net" IncludeFilters="*.dll" ExcludeFilters="" Recursion="true" AllowUse="true"/>
</NET>
<!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью AutoLisp и VisualLisp-->
<LISP AllowLoad="true">
<LoadingFilter Directory="%XmlPath.LocalRepository2%" IncludeFilters="*.lsp;*.fas;*.vlx" ExcludeFilters="Acad*.lsp;Acad*.fas" Recursion="true" AllowUse="true"/>
</LISP>
<!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью VBA-->
<VBA AllowLoad="true">
<LoadingFilter Directory="%XmlPath.LocalRepository%\bin\VBA" IncludeFilters="*.dvb" ExcludeFilters="" Recursion="true" AllowUse="true"/>
</VBA>
</LoadingFilters>
</CommonSettings>
|