Недавно я интегрировался с веб сервисами компании Verizon. Общение с версисом происходило через XML с определенной структорой. В общем, запрос представлял из себя шапку (header) и сам запрос (body). Пример:
В документации были только примеры XML запросов и ответов для каждого типа запроса, например активация линии, информация о немере, смена тарифного плана и тп. В основном сохранялся только тег request, а внутри него менялся контет.
Сначала я эти запросы формировал руками через XLinq и это было совсем не круто. Потом компания предоставила XSD файлы для каждого запроса и сказала, что мы можем использовать эти файлы для генерации XML запросов. До этого с XSD никогда не сталкивался и пока не нагуглил не знал как оно мне поможет.
В общем помогают эти файлы следующим образом:
1. Cначала с помощью одной из утилит XSD.exe от Microsoft или Xsd2Code на codeplex, можно сгенерить cs или vb файлы.
2. Код в этих файлах будет сгенерен с Xml аттрибутами, необхадимыми для формаирования правильного XML запроса. Чтоб сгенерить Xml, который я показал в примере, используется XmlSerializer.
Так в 2 шага можно сгенерировать валидный XML по XSD файлам.
Когда я дошел до генерации CS файлов из XSD, то выбора было не особо та и примеров как это делать тоже, в основном ссылки на xsd.exe с которым я так и не подружился.
В данной статье я хотел рассказать об утилите Xsd2Code.Чем она хороша ?
Для начала скачать и установить.
Дальше вызвав в консоли Xsd2Code.exe можно увидеть список доступных параметров
Это не полный список, их раза в 2-3 больше, но нам все не надо.
Дальше генерим CS файл из XSD. Пример:
***** ******** ** MISC XML ****** HTC
В документации были только примеры XML запросов и ответов для каждого типа запроса, например активация линии, информация о немере, смена тарифного плана и тп. В основном сохранялся только тег request, а внутри него менялся контет.
Сначала я эти запросы формировал руками через XLinq и это было совсем не круто. Потом компания предоставила XSD файлы для каждого запроса и сказала, что мы можем использовать эти файлы для генерации XML запросов. До этого с XSD никогда не сталкивался и пока не нагуглил не знал как оно мне поможет.
В общем помогают эти файлы следующим образом:
1. Cначала с помощью одной из утилит XSD.exe от Microsoft или Xsd2Code на codeplex, можно сгенерить cs или vb файлы.
2. Код в этих файлах будет сгенерен с Xml аттрибутами, необхадимыми для формаирования правильного XML запроса. Чтоб сгенерить Xml, который я показал в примере, используется XmlSerializer.
Так в 2 шага можно сгенерировать валидный XML по XSD файлам.
Когда я дошел до генерации CS файлов из XSD, то выбора было не особо та и примеров как это делать тоже, в основном ссылки на xsd.exe с которым я так и не подружился.
В данной статье я хотел рассказать об утилите Xsd2Code.Чем она хороша ?
- Очень много настроек
- Интегрируется с студией
- Понимает теги xsd:include, которые ссылаются на другие xsd файлы.
- Не сложная в использовании
Для начала скачать и установить.
Дальше вызвав в консоли Xsd2Code.exe можно увидеть список доступных параметров
Usage: Xsd2Code.exe[Namespace] [Output file name] [Options] Where: - Path to an XSD file. Required [Namespace] - Generated code namespace. Optional. File name without extension if no value is specified [Output file name] - Name of the output (generated) file. Optional. [Options] - Optional. See below for description Options: /o[utput] - Name of the output (generated) file. By default, name of the source file with extension .Designer.cs (.Designer.vb or .Designer.cpp for VisualVasic and Visual C++ respectively) /n[s] - Generated code CLR namespace. Default: file name without extension /l[anguage] - Generated code language (CS|VB|CPP). Default: CS /pl[atform] - Generated code target platform (Net20|Net30|Net35|Silverlight20). Default: Net20 /c[ollection] - Collection base (Array|BindingList|List|ObservableCollection|DefinedType). Default: List /cu[customusings] - Comma-separated of custom usings definition (E.g "Xsd2Code.Library,System.Xml.Linq") /sm - Serialize method name. Default: Serialize /dm - Deserialize method name. Default: Deserialize /lf[m] - LoadFromFile method name. Default: LoadFromFile /sf[m] - SaveToFile methodname. Default: SaveToFile /is[+] - Include Serialize method /is- - Do not include Serialize method (default) /cl[+] - Include Clone method /cl- - Do not include Clone method (default)
Это не полный список, их раза в 2-3 больше, но нам все не надо.
Дальше генерим CS файл из XSD. Пример:
Xsd2Code.exe POSBizCheckStatus.xsd Ivanov.VerizonIntegration C:\POSBizCheckStatus.cs /pl Net35 /c Array /xa /is /sс
По порядку:
Xsd2Code.exe - путь к файлу или если вы находитесь в папке с утилитой, то просто название запускаемого файла утилиты.
POSBizCheckStatus.xsd - путь к xsd файлу или если он находится в папке с утилитой то просто нзвание файла. Вайжно!!! Лучше чтоб путь к xsd файлу не содержал пробелы, а то может не сработать
Ivanov.VerizonIntegration - namespace в котором будет сгенерированый класс.
C:\POSBizCheckStatus.cs - путь и название cs файла в котором будет сгенереный класс по XSD схеме.
/pl Net35 - версия .NET для кода в данном случае 3.5
/c Array - как мы хотим видеть колекции, на выбоор несколько опций, в моем случае хочу чтоб колекции были как обычные массивы.
/xa - именно с этой опцией добавляются xml аттрибуты, которые помогу XmlSerializer'у правилно сгенерировать XML. Эту опцию можно отключить. Пример
/is - этот ключ добавляет в файл метод Serialize / Deserialize. Очень удобно, самому уже не надо писать.
/sc - добавляет коментарии к свойствам.
Остальные ключи добавляются по мере необходимости. Есть настроки для WCF, Linq, DataBinding и тп.
Если у вас несколько XSD файлов и для них всех нужно сгенерить классы, например как у меня
то можно использовать bat файл.
Нужно подставить значение XsdPath, OutPath, ExePath и Namespace. В моем случае я получил список файлов в папке Code.
Это важно!
OutPath папка должна существовать, иначе провал.
XsdPath путь не должен содержать пробелов, иначе тоже пробвал
Пример использования в коде
Пользуйтесь! Будут вопросы - отвечу.
Xsd2Code.exe - путь к файлу или если вы находитесь в папке с утилитой, то просто название запускаемого файла утилиты.
POSBizCheckStatus.xsd - путь к xsd файлу или если он находится в папке с утилитой то просто нзвание файла. Вайжно!!! Лучше чтоб путь к xsd файлу не содержал пробелы, а то может не сработать
Ivanov.VerizonIntegration - namespace в котором будет сгенерированый класс.
C:\POSBizCheckStatus.cs - путь и название cs файла в котором будет сгенереный класс по XSD схеме.
/pl Net35 - версия .NET для кода в данном случае 3.5
/c Array - как мы хотим видеть колекции, на выбоор несколько опций, в моем случае хочу чтоб колекции были как обычные массивы.
/xa - именно с этой опцией добавляются xml аттрибуты, которые помогу XmlSerializer'у правилно сгенерировать XML. Эту опцию можно отключить. Пример
[GeneratedCode("Xsd2Code", "3.4.0.38968")] [Serializable] [DesignerCategory("code")] [XmlType(AnonymousType = true, Namespace = "http://pos.odc.vzwcorp.com")] public class miscResponseAccessoryList { private static XmlSerializer serializer; private miscResponseAccessoryListAccessoryInfo[] accessoryInfoField; private string countField; [XmlElement(DataType = "integer", Order = 0)] public string count { get { return countField; } set { countField = value; } } [XmlElement("accessoryInfo", Order = 1)] public miscResponseAccessoryListAccessoryInfo[] accessoryInfo { get { return accessoryInfoField; } set { accessoryInfoField = value; } }
/is - этот ключ добавляет в файл метод Serialize / Deserialize. Очень удобно, самому уже не надо писать.
public virtual string Serialize() { StreamReader streamReader = null; MemoryStream memoryStream = null; try { memoryStream = new MemoryStream(); Serializer.Serialize(memoryStream, this); memoryStream.Seek(0, SeekOrigin.Begin); streamReader = new StreamReader(memoryStream); return streamReader.ReadToEnd(); } finally { if ((streamReader != null)) { streamReader.Dispose(); } if ((memoryStream != null)) { memoryStream.Dispose(); } } }
/sc - добавляет коментарии к свойствам.
Остальные ключи добавляются по мере необходимости. Есть настроки для WCF, Linq, DataBinding и тп.
Если у вас несколько XSD файлов и для них всех нужно сгенерить классы, например как у меня
то можно использовать bat файл.
@echo off set XsdPath="c:\Path\To\Xsd\Files" set OutPath=%XsdPath%\Code set ExePath="c:\Program Files (x86)\Xsd2Code\" set Namespace=MyProject.Namespace echo.Starting processing XSD files ... for /f %%a IN ('dir %XsdPath%\*.xsd /a-d /b /s') do call:ProcessXsd %%a echo.Finished processing XSD files ... echo.&pause& goto:eof :ProcessXsd %ExePath%\Xsd2Code %~1 %Namespace% %XsdPath%\Code\%~n1%.cs /pl Net35 /c Array /xa /is echo.Processed %~n1 goto:eof
Нужно подставить значение XsdPath, OutPath, ExePath и Namespace. В моем случае я получил список файлов в папке Code.
Это важно!
OutPath папка должна существовать, иначе провал.
XsdPath путь не должен содержать пробелов, иначе тоже пробвал
Пример использования в коде
logger.Info("Building XML for REASSIGN ACCOUNT request."); POSBizServices requestMessage = serviceRequestFactory.CreateReassignAccountRequest(request); logger.Info("Sending REASSIGN ACCOUNT request."); string requestXml = requestMessage.Serialize(); string responseXml = SendRequest(requestXml); logger.Debug("REASSIGN ACCOUNT response: {0}.", responseXml); POSBizServices responseMessage; try { logger.Info("Deserializing XML response to POSBizServices as LINE STATUS response."); POSBizServices.Deserialize(responseXml, out responseMessage); } catch (Exception e) { logger.ErrorException("Error while deserializing LINE STATUS XML response to POSBizServices", e); throw; }
Пользуйтесь! Будут вопросы - отвечу.
Комментариев нет:
Отправить комментарий