Dinamik XML Oluşturma (Örn Logo)
Dinamik bir dataset’i Logo’nun anlayabileceği bir xml formatına dönüştürmek gereken bir projeye giriştim.
Bir dispatch yani irsaliye oluşturmak için logo xml formatında çıktı oluşturmak gerekir, Eğer logo com objesi çalışıyor ise, yani tiger versiyonunda bir logo ya entegrasyon yapacaksanız veya logo tiger için bir xml oluşturacaksanız, logo com objesi referansları altındaki clsunity altında yeni bir irsaliye tipinde obje oluşturup daha sonra ilgili objeyi xml export yaptığınızda hedefinize ulaşmış oluyorsunuz.
Fakat eğer logo tiger versiyonu yoksa ve bu versiyon go versiyonu ise, işte o zaman ilgili sistemden aynı objeyi yaratamayacaksınız “Çok Zararlı Hata” diye garip ve açıklayıcı olmayan bir hata alacaksınız demektir.
Özellikle dispatch tipindeki xml aşağıdaki gibi bir xml olacak,

XML verisinin tamamına ulaşmak için logo go veya tiger’a bir irsaliye girişi yapıp sağ tıklayıp xml olarak export yap seçeneğini kullanabileceksiniz.
Biz şimdi bu makalede size com objesi çalıştırmadan dışarıya çıkartılan xml’i class’a dönüştürüp nasıl aynı class’tan aldığımızı anlatacağım.
Örnek bir belge girip xml olarak çıkardıktan sonra ilgili class’ın property’lerine ait bir class oluşturalım.
Imports System.Xml.Serialization
<XmlRoot(ElementName:="TRANSACTION")>
Public Class TRANSACTION
<XmlElement(ElementName:="INTERNAL_REFERENCE")>
Public Property INTERNALREFERENCE As Integer
<XmlElement(ElementName:="TYPE")>
Public Property TYPE As Integer
<XmlElement(ElementName:="MASTER_CODE")>
Public Property MASTERCODE As Integer
<XmlElement(ElementName:="QUANTITY")>
Public Property QUANTITY As Integer
<XmlElement(ElementName:="PRICE")>
Public Property PRICE As Integer
<XmlElement(ElementName:="TOTAL")>
Public Property TOTAL As Integer
<XmlElement(ElementName:="UNIT_CODE")>
Public Property UNITCODE As String = ""
<XmlElement(ElementName:="UNIT_CONV1")>
Public Property UNITCONV1 As Integer
<XmlElement(ElementName:="UNIT_CONV2")>
Public Property UNITCONV2 As Integer
<XmlElement(ElementName:="VAT_INCLUDED")>
Public Property VATINCLUDED As Integer
<XmlElement(ElementName:="VAT_RATE")>
Public Property VATRATE As Integer
<XmlElement(ElementName:="VAT_BASE")>
Public Property VATBASE As Integer
<XmlElement(ElementName:="TOTAL_NET")>
Public Property TOTALNET As Integer
<XmlElement(ElementName:="DATA_REFERENCE")>
Public Property DATAREFERENCE As Integer
<XmlElement(ElementName:="FA_INFO")>
Public Property FAINFO As String = ""
<XmlElement(ElementName:="SL_DETAILS")>
Public Property SLDETAILS As String = ""
<XmlElement(ElementName:="DETAILS")>
Public Property DETAILS As String = ""
<XmlElement(ElementName:="QCLIST")>
Public Property QCLIST As String = ""
<XmlElement(ElementName:="DIST_ORD_REFERENCE")>
Public Property DISTORDREFERENCE As Integer
<XmlElement(ElementName:="CAMPAIGN_INFOS")>
Public Property CAMPAIGNINFOS As String = ""
<XmlElement(ElementName:="MULTI_ADD_TAX")>
Public Property MULTIADDTAX As Integer
<XmlElement(ElementName:="ADDTAXLINELIST")>
Public Property ADDTAXLINELIST As String = ""
<XmlElement(ElementName:="EDT_CURR")>
Public Property EDTCURR As Integer
<XmlElement(ElementName:="ORGLOGOID")>
Public Property ORGLOGOID As String = ""
<XmlElement(ElementName:="GENIUSFLDSLIST")>
Public Property GENIUSFLDSLIST As String = ""
<XmlElement(ElementName:="DEFNFLDSLIST")>
Public Property DEFNFLDSLIST As String = ""
<XmlElement(ElementName:="MONTH")>
Public Property MONTH As Integer
<XmlElement(ElementName:="YEAR")>
Public Property YEAR As Integer
<XmlElement(ElementName:="FAREGDEFNFLDLIST")>
Public Property FAREGDEFNFLDLIST As String = ""
<XmlElement(ElementName:="PREACCLINES")>
Public Property PREACCLINES As String = ""
<XmlElement(ElementName:="GUID")>
Public Property GUID As String = ""
<XmlElement(ElementName:="FOREIGN_TRADE_TYPE")>
Public Property FOREIGNTRADETYPE As Integer
<XmlElement(ElementName:="DISTRIBUTION_TYPE_WHS")>
Public Property DISTRIBUTIONTYPEWHS As Integer
<XmlElement(ElementName:="DISTRIBUTION_TYPE_FNO")>
Public Property DISTRIBUTIONTYPEFNO As Integer
<XmlElement(ElementName:="DETAIL_LEVEL")>
Public Property DETAILLEVEL As Integer
<XmlElement(ElementName:="DISCEXP_CALC")>
Public Property DISCEXPCALC As Integer
End Class
<XmlRoot(ElementName:="TRANSACTIONS")>
Public Class TRANSACTIONS
<XmlElement(ElementName:="TRANSACTION")>
Public Property TRANSACTION As List(Of TRANSACTION)
End Class
<XmlRoot(ElementName:="DISPATCH")>
Public Class DISPATCH
<XmlElement(ElementName:="INTERNAL_REFERENCE")>
Public Property INTERNALREFERENCE As Integer
<XmlElement(ElementName:="TYPE")>
Public Property TYPE As Integer
<XmlElement(ElementName:="NUMBER")>
Public Property NUMBER As String = ""
<XmlElement(ElementName:="DATE")>
Public Property [DATE] As String = ""
<XmlElement(ElementName:="DOC_NUMBER")>
Public Property DOCNUMBER As String = ""
<XmlElement(ElementName:="ARP_CODE")>
Public Property ARPCODE As String = ""
<XmlElement(ElementName:="NOTES1")>
Public Property NOTES1 As String = ""
<XmlElement(ElementName:="CREATED_BY")>
Public Property CREATEDBY As Integer
<XmlElement(ElementName:="DATE_CREATED")>
Public Property DATECREATED As String = ""
<XmlElement(ElementName:="DATA_REFERENCE")>
Public Property DATAREFERENCE As Integer
<XmlElement(ElementName:="ORIG_NUMBER")>
Public Property ORIGNUMBER As String = ""
<XmlElement(ElementName:="TRANSACTIONS")>
Public Property TRANSACTIONS As TRANSACTIONS
<XmlElement(ElementName:="ORGLOGOID")>
Public Property ORGLOGOID As String = ""
<XmlElement(ElementName:="DEFNFLDSLIST")>
Public Property DEFNFLDSLIST As String = ""
<XmlElement(ElementName:="DEDUCTIONPART1")>
Public Property DEDUCTIONPART1 As Integer
<XmlElement(ElementName:="DEDUCTIONPART2")>
Public Property DEDUCTIONPART2 As Integer
<XmlElement(ElementName:="AFFECT_RISK")>
Public Property AFFECTRISK As Integer
<XmlElement(ElementName:="DISP_STATUS")>
Public Property DISPSTATUS As Integer
<XmlElement(ElementName:="GUID")>
Public Property GUID As String
<XmlElement(ElementName:="SHIP_DATE")>
Public Property SHIPDATE As String = ""
<XmlElement(ElementName:="DOC_DATE")>
Public Property DOCDATE As String = ""
<XmlElement(ElementName:="LABEL_LIST")>
Public Property LABELLIST As String = ""
<XmlElement(ElementName:="XRELATED_ARP")>
Public Property XRELATEDARP As String = ""
<XmlAttribute(AttributeName:="DBOP")>
Public Property DBOP As String = ""
<XmlText>
Public Property Text As String = ""
End Class
<XmlRoot(ElementName:="SALES_DISPATCH")>
Public Class SALESDISPATCH
<XmlElement(ElementName:="DISPATCH")>
Public Property DISPATCH As DISPATCH
End Class
Ve söz konusu xml’i otomatik oluşturacak bir extension tasarlayalım.
Module LogoExtension
<Extension()>
Function ToXml(Of T)(ByVal obj As T) As String
Dim serialiser As XmlSerializer = New XmlSerializer(GetType(T))
Using streamm = New MemoryStream()
serialiser.Serialize(streamm, obj)
Return Encoding.UTF8.GetString(streamm.ToArray())
End Using
End Function
<Extension()>
Function ToXml(Of T)(ByVal obj As T, ByVal removeNamespace As Boolean) As String
Dim ns = New XmlSerializerNamespaces({XmlQualifiedName.Empty})
Dim settings = New XmlWriterSettings With {
.Indent = True,
.OmitXmlDeclaration = True
}
If removeNamespace Then
Return ToXml(Of T)(obj, settings, ns)
End If
Return ToXml(Of T)(obj)
End Function
<Extension()>
Function ToXml(Of T)(ByVal obj As T, ByVal settings As XmlWriterSettings, ByVal ns As XmlSerializerNamespaces) As String
Using stream = New StringWriter()
Using writer = XmlWriter.Create(stream, settings)
Dim serializer = New XmlSerializer(GetType(T))
serializer.Serialize(writer, obj, ns)
Return stream.ToString()
End Using
End Using
End Function
End Module
Şimdi bu methodları çağırarak xml classımızı dolduralım.
Dim sd = GetDispatchData()
Dim xml = sd.ToXml(True)
Class set etme işini statik yaptım, ama siz kodlama yaparken dinamik olarak classınızı algoritmanıza göre set edebilirsiniz.
Public Shared Function GetDispatchData() As SALESDISPATCH
Dim sd As SALESDISPATCH = New SALESDISPATCH()
Dim dispatch As DISPATCH = New DISPATCH()
sd.DISPATCH = dispatch
dispatch.DBOP = "INS"
dispatch.INTERNALREFERENCE = 0
dispatch.TYPE = 7
dispatch.NUMBER = "~"
dispatch.DATE = DateTime.Now.ToString("dd.MM.yyyy")
dispatch.DOCNUMBER = "VOID-51"
dispatch.ARPCODE = "PESINSATIS"
dispatch.NOTES1 = "PESINSATIS"
dispatch.CREATEDBY = 1
dispatch.DATECREATED = DateTime.Now.ToString("dd.MM.yyyy")
dispatch.DATAREFERENCE = 1
dispatch.DEDUCTIONPART1 = 2
dispatch.DEDUCTIONPART2 = 3
dispatch.AFFECTRISK = 0
dispatch.DISPSTATUS = 1
dispatch.GUID = Guid.NewGuid().ToString()
dispatch.SHIPDATE = DateTime.Now.ToString("dd.MM.yyyy")
dispatch.DOCDATE = DateTime.Now.ToString("dd.MM.yyyy")
dispatch.TRANSACTIONS = New TRANSACTIONS() With {
.TRANSACTION = New List(Of TRANSACTION)()
}
Dim trans As TRANSACTION = New TRANSACTION()
trans.INTERNALREFERENCE = 0
trans.TYPE = 0
trans.MASTERCODE = 10001
trans.QUANTITY = 2
trans.PRICE = 100
trans.TOTAL = 100
trans.UNITCODE = "ADET"
trans.UNITCONV1 = 1
trans.UNITCONV2 = 1
trans.VATINCLUDED = 1
trans.VATRATE = 10
trans.VATBASE = 100
trans.TOTALNET = 100
trans.DATAREFERENCE = 0
trans.DISTORDREFERENCE = 0
trans.MULTIADDTAX = 0
trans.EDTCURR = 1
trans.MONTH = 5
trans.YEAR = 2024
trans.GUID = Guid.NewGuid().ToString()
trans.FOREIGNTRADETYPE = 0
trans.DISTRIBUTIONTYPEWHS = 0
trans.DISTRIBUTIONTYPEFNO = 0
dispatch.TRANSACTIONS.TRANSACTION.Add(trans)
trans = New TRANSACTION()
trans.INTERNALREFERENCE = 0
trans.TYPE = 2
trans.DETAILLEVEL = 1
trans.DISCEXPCALC = 1
trans.QUANTITY = 0
trans.TOTAL = 100
trans.UNITCONV1 = 0
trans.UNITCONV2 = 0
trans.DATAREFERENCE = 0
trans.DISTORDREFERENCE = 0
trans.MULTIADDTAX = 0
trans.GUID = Guid.NewGuid().ToString()
trans.FOREIGNTRADETYPE = 0
trans.DISTRIBUTIONTYPEWHS = 0
trans.DISTRIBUTIONTYPEFNO = 0
dispatch.TRANSACTIONS.TRANSACTION.Add(trans)
Return sd
End Function
Sonuç olarak class’ı aşağıdaki gibi set etmek için ilgili fonksiyon içine değişkenleri set ederek dilediğiniz xml’i oluşturabilirsiniz.
Şuan size logo xml dokümanı hazırladım, ama siz bu algoritmayı farklı bir xml formatına da dönüştürebilirsiniz.