Hi!
I’m developing an application where I use wcf services (vb.net - visual studio 2010) . I use the web services to:
1.Send an xml schema populated with data
2.Get a list of available web services
3.Get a specific xsd schema
What I have to do is:
1.Get a xsd schema form the authority and use this xsd to generate a xml populated with data
2.Call the webservice where I can specify a number for a specific xsd schema , and get the xsd schema in return. Then I can validat my xml schema against it before I send it to the authority
3.Use a web service where my xml string is bound to a string property of a method of the wcf service and I send the xml file to the authority
My xsd looks (almost) like this:
(Pleas ignore if something is left out in the xsd - it is there just so I can explain my problem better)Code:<?xml version="1.0" encoding="iso-8859-1"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:br="http://www.br.se/or" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!--title='Tittle' lang='E'--> <xs:element name="Schema"> <xs:annotation> <xs:documentation> <br:txt br:lang="E" br:txttype="LEDE"> <p>Some text</p> </br:txt> </xs:documentation> <xs:documentation> ………………………… <xs:complexType> <xs:sequence> <xs:element minOccurs="0" ref="Information"/> <xs:element minOccurs="0" ref="Payer"/> </xs:sequence> <xs:attribute fixed="105" name="numberr" type="xs:integer" use="required"/> <xs:attribute fixed="10360" name="externalnumberr" type="xs:integer" use="required"/> <xs:attribute fixed="Title" name="title" type="xs:string" use="optional"/> <xs:attribute fixed="4895" name="groupid" type="xs:positiveInteger" use="optional"/> <xs:attribute name="id" use="optional"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="761065"> <xs:annotation> <xs:documentation>Text</xs:documentation> </xs:annotation> </xs:enumeration> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:anyAttribute/> </xs:complexType> </xs:element> <xs:element name="Info"> <xs:annotation> <xs:documentation> <br:txt br:lang="E" br:txttype="LEDE"> <p>Some Text</p> </br:txt> </xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="Task"> <xs:annotation> <xs:documentation> <br:txt br:lang="E" br:txttype="LEDE"> <p>Some text</p> </br:txt> </xs:documentation> </xs:annotation> </xs:element> <xs:element ref="Year"> <xs:annotation> <xs:documentation> <br:txt br:lang="E" br:txttype="LEDE"> <p>Some Text</p> </br:txt> </xs:documentation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="Taskowner"/> </xs:sequence> <xs:attribute fixed="4877" name="id" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> <xs:element name="TaskSpesialTask"> <xs:annotation> <xs:documentation> <br:info br:type="some txt">1</br:info> </xs:documentation> </xs:annotation> <xs:complexType> <xs:simpleContent> <xs:extension base="List1"> <xs:attribute fixed="212" name="schemaid" type="xs:positiveInteger" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:simpleType name="List2"> <xs:annotation> <xs:documentation> <br:info br:type="id">2</br:info> </xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:length value="1"/> <xs:enumeration value="1"> <xs:annotation> <xs:documentation> <br:txt br:lang="E" br:txttype="LEDE"> <p>Some text</p> </br:txt> </xs:documentation> </xs:annotation> </xs:enumeration> <xs:enumeration value="2"> <xs:annotation> <xs:documentation> <br:txt br:lang="E" br:txttype="LEDE"> <p>Some text</p> </br:txt> </xs:documentation> </xs:annotation> </xs:enumeration> </xs:restriction> </xs:simpleType> <xs:element name="Year"> <xs:annotation> <xs:documentation> <br:info br:type="pl">2</br:info> </xs:documentation> </xs:annotation> <xs:complexType> <xs:simpleContent> <xs:extension base="Format"> <xs:attribute fixed="692" name="schemaid" type="xs:positiveInteger" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:simpleType name="Format"> <xs:annotation> <xs:documentation> <br:info br:type="id">6</br:info> </xs:documentation> </xs:annotation> <xs:restriction base="xs:gYear"/> </xs:simpleType> <xs:element name="TaskOwner"> <xs:annotation> <xs:documentation> <br:txt br:lang="E" br:txttype="LEDE"> <p>Some Text</p> </br:txt> </xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref="TaskoOwnerNumber"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="TaskOwnerName"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="TaskOwnerAdress <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="TaskOwnerPhone"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="TaskOwnerEmail"> <xs:annotation> </xs:annotation> </xs:element> </xs:sequence> <xs:attribute fixed="48" name="id" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> <xs:element name="TaskOwnerNumber"> <xs:annotation> </xs:annotation> <xs:complexType> <xs:simpleContent> <xs:extension base="TextFormat"> <xs:attribute fixed="21" name="id" type="xs:positiveInteger" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:simpleType name="TextFormat"> <xs:annotation> <xs:documentation> <br:info br:type="id">1</br:info> </xs:documentation> <xs:documentation> <br:txt br:lang="E" br:txttype="F"> <p>Wrong number</p> </brreg:tekst> </xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:length value="9"/> </xs:restriction> </xs:simpleType> <xs:element name="TaskOwner name"> <xs:annotation> </xs:annotation> <xs:complexType> <xs:simpleContent> <xs:extension base="TextFormat"> <xs:attribute fixed="2" name="id" type="xs:positiveInteger" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="TaskOwner Adress"> <xs:annotation> </xs:annotation> </xs:element> And so on for phone and email <xs:element name="Payers"> <xs:annotation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element maxOccurs="20000" minOccurs="0" ref="PayersInfo"/> <xs:element minOccurs="0" ref="PaymentTotal"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="NumberOfPayers"> <xs:annotation> </xs:annotation> </xs:element> </xs:sequence> <xs:attribute fixed="410" name="id" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> <xs:element name="PayersInfo"> <xs:annotation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" ref="PayerBirthNumber"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="PayerNumber"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="PayerBirthDay"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="PayerName"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="PayerAdress"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="PayerPhone"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="PayerEmail"> <xs:annotation> </xs:annotation> </xs:element> <xs:element minOccurs="0" ref="PayerSum"> <xs:annotation> </xs:annotation> </xs:element> </xs:sequence> <xs:attribute fixed="48" name="id" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> <xs:element name="PayerBirthNumber"> <xs:annotation> </xs:annotation> <xs:complexType> <xs:simpleContent> <xs:extension base="TextFormat"> <xs:attribute fixed="2305" name="id" type="xs:positiveInteger" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:simpleType name="TextFormat"> <xs:annotation> </xs:annotation> <xs:restriction base="xs:string"> <xs:length value="11"/> </xs:restriction> </xs:simpleType> And so on for PayerNumber, PayerBirthDay, PAYerNAMe, PayerAdress, PayerPhone, PayerEmail….. </xs:schema>
I use XSD.exe to auto generate a vb class from my xsd schema.
My auto generated classes looks like this and they are stored in a file called Schema.vb
I'm not quite sure how I can use the auto generated partial classes.Code:Partial Public Class Schema Private info As Info Private payers As Payers Public Sub New() MyBase.New End Sub Public Property Info() As Info End Property Public Property Payers() As Payers End Property End class Partial Public Class Info Private year As Year Private taskOwner As TaskOwner Public Sub New() MyBase.New End Sub Public Property Year() As Year End Property Public Property TaskOwner() As TaskOwner End Property End Class Partial Public Class Year Public Sub New() MyBase.New End Sub End Class Partial Public Class TaskOwner Private taskOwnerName As TaskOwnerName ..... Private taskOwnerEmail As TaskOwnerEmail Public Sub New() MyBase.New End Sub Public Property TaskOwnerName() As TaskOwnerName End Property Public Property TaskOwnerName() As TaskOwnerName End Property End Class Partial Public Class TaskOwnerName End class .... Partial Public Class TaskOwnerEmail End Class Partial Public Class Task Private valuefield As TaskType Public Sub New() MyBase.New End Sub Public Property Value() As TaskType End Property End Class Public Enum TaskTypeValue <System.Xml.Serialization.XmlEnumAttribute("1")> _ Item1 <System.Xml.Serialization.XmlEnumAttribute("2")> _ Item2 End Enum Partial Public Class Payers Private payersInfo() As PayersInfo - Array of PayersObjects Private paymentTotal AS PaymentTotal Private numberOfPayers AS NumberOfPayers Public Sub New() MyBase.New End Sub Public Property PayersInfo() As PayersInfo() End Property Public Property PaymentTotal() As PaymentTotal End Property Public Property NumberOfPayers() As NumberOfPayers End Property End Class Partial Public Class PaymentTotal Public Sub New() MyBase.New End Sub End Class Partial Public Class NumberOfPayers Public Sub New() MyBase.New End Sub End Class Partial Public Class PayersInfo Private payerBirthnumberAs PayerBirthnumber ..... Private payerEmail As PayerEmail Public Sub New() MyBase.New End Sub Public Property PayerBirthnumber() As PayerBirthnumber End Property ...... Public Property PayerEmail() As PayerEmail End Property End class Partial Public Class PayerBirthnumber Public Sub New() MyBase.New End Sub End Class .... Partial Public Class PayerEmail Public Sub New() MyBase.New End Sub End Class
I have another Class SendSchema that populates the partial class objects, serialize the object to an xml and ships the xml to the wcf.
But when I use the partial classes in the sendSchema class I have to instantiate all my partial classes like this
and so on until I have done this for all my partial classesCode:Dim schema_Obj = New Skjema Dim info_Obj As New Info Dim year_Obj as New Year Dim taskOwner_Obj as New TaskOwner
When I populate the objects with data I have to say
and so on.Code:schema_obj.info_obj.task_Obj.Value = TaskType.Item1 schema_Obj.info_Obj.year_Obj.Value = "2011" schema_Obj.info_Obj.taskOwner_Obj.taskOwnerName_Obj.value="Bob"
Then I have to serialize my Schema Object (this is the object holding all the information stored in all other objects - Info,TaskoOwner....) like this
I have multiple xsd schema I have to do this for, and the schemas is changing once a year.Code:Dim memorystream As New System.IO.MemoryStream Dim ser As New XmlSerializer(GetType(Schema)) ser.Serialize(memorystream, schema_obj)
My questions is:
1. Is deserialization and serialization the best approach for me?
2. Is it possible to automate the deserialization step (xsd to class) in any way?
3. How can I use my partial classes without train wreck the code (Law Of Demeter)
I very much appreciate all the help I can get on this!!
Thanks in advance!!




Reply With Quote
