VbNet · Console
Imports System
Imports System.Collections.Generic
Imports System.Collections
Imports System.IO
Imports System.Text
Imports System.Collections.ObjectModel
Imports System.Linq
Imports System.Reflection
Imports System.Xml.Serialization
Imports System.Xml
Imports System.Xml.Linq
Imports System.Xml.XPath
Imports System.Xml.Schema
' https://stackoverflow.com/questions/53226893/vb-net-create-a-class-to-serialize
<XmlRoot([Namespace]:="FatturaElettronica")>
<XmlType([Namespace]:="")> ' Fixed added empty namespace for all elements.
Public Class FatturaElettronica
Public quantity As Integer
Sub New()
FatturaElettronicaHeader = New FatturaElettronicaHeader
End Sub
Property FatturaElettronicaHeader As FatturaElettronicaHeader
End Class
Public Class FatturaElettronicaHeader
Sub New()
DatiTrasmissione = New DatiTrasmissione
End Sub
Property DatiTrasmissione As DatiTrasmissione
End Class
Public Class DatiTrasmissione
Sub New()
Idtrasmittente = New idTrasmittente
' By allocating ContattiTrasmittente you cause its value to be serialized by default
ContattiTrasmittente = New ContattiTrasmittente
End Sub
Property Idtrasmittente As idTrasmittente
Property ProgressivoInvio As String
' Fixed added FormatoTrasmissioneSpecified and made FormatoTrasmissione an explicitly implemented property
Private m_FormatoTrasmissione as FormatoTrasmissioneType
<XmlIgnore>
Public Property FormatoTrasmissioneSpecified as Boolean
Property FormatoTrasmissione As FormatoTrasmissioneType
Get
Return m_FormatoTrasmissione
End Get
Set
' For convenience set FormatoTrasmissioneSpecified automatically when the property is set publicly.
FormatoTrasmissioneSpecified = true
m_FormatoTrasmissione = value
End Set
End Property
Property CodiceDestinatario As String
' Fixed added ShouldSerializeContattiTrasmittente()
Property ContattiTrasmittente As ContattiTrasmittente
Public Function ShouldSerializeContattiTrasmittente() as Boolean
Return ContattiTrasmittente.ShouldSerialize()
End Function
Property PecDestinatario As String
End Class
Public Class idTrasmittente
Property IdPaese As String
Property IdCodice As String
End Class
Public Class ContattiTrasmittente
Property Telefono As String
Property Email As String
End Class
' Fixed added an extension method to test whether a ContattiTrasmittente should be serialized.
Public Module ContattiTrasmittenteExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Function ShouldSerialize(ByVal ContattiTrasmittente as ContattiTrasmittente) as Boolean
Return ContattiTrasmittente IsNot Nothing And (ContattiTrasmittente.Telefono IsNot Nothing Or ContattiTrasmittente.Email IsNot Nothing)
End Function
End Module
Public Enum FormatoTrasmissioneType
FPA12
FPR12
End Enum
Public Module Module1
Public Sub Main()
Dim fattEle As New FatturaElettronica
Dim ns2 As New Xml.Serialization.XmlSerializerNamespaces()
ns2.Add("p", "FatturaElettronica")
Dim xml as String = fattEle.GetXml(ns2)
Console.WriteLine("")
Console.WriteLine("{0} with FormatoTrasmissione unspecified:", fattEle)
Console.WriteLine(xml)
fattEle.FatturaElettronicaHeader.DatiTrasmissione.FormatoTrasmissione = Nothing
Dim xml2 as String = fattEle.GetXml(ns2)
Console.WriteLine("")
Console.WriteLine("{0} with FormatoTrasmissione specified:", fattEle)
Console.WriteLine(xml2)
End Sub
Function GetXml() As String
Dim xml as String = <myvar>
<var>...</var>
</myvar>.ToString()
Return xml
End Function
End Module
Public Module XmlSerializationHelper
<System.Runtime.CompilerServices.Extension> _
Public Function LoadFromXML(Of T)(xmlString As String) As T
Using reader As New StringReader(xmlString)
Return DirectCast(New XmlSerializer(GetType(T)).Deserialize(reader), T)
End Using
End Function
<System.Runtime.CompilerServices.Extension> _
Public Function GetXml(Of T)(obj As T, Optional omitStandardNamespaces As Boolean = False) As String
Dim ns As XmlSerializerNamespaces = Nothing
If omitStandardNamespaces Then
ns = New XmlSerializerNamespaces()
' Disable the xmlns:xsi and xmlns:xsd lines.
ns.Add("", "")
End If
Return obj.GetXml(ns)
End Function
<System.Runtime.CompilerServices.Extension> _
Public Function GetXml(Of T)(obj As T, ns as XmlSerializerNamespaces) As String
Using textWriter = New StringWriter()
Dim settings = New XmlWriterSettings() With { _
.Indent = True _
}
' For cosmetic purposes.
Using xmlWriter = System.Xml.XmlWriter.Create(textWriter, settings)
Dim serializer as New XmlSerializer(obj.GetType())
serializer.Serialize(xmlWriter, obj, ns)
End Using
Return textWriter.ToString()
End Using
End Function
<System.Runtime.CompilerServices.Extension> _
Public Function GetOuterXml(node as XmlNode, Optional indent as Boolean = true) as String
Using textWriter = New StringWriter()
' For cosmetic purposes.
Dim settings = New XmlWriterSettings() With { _
.Indent = indent, _
.OmitXmlDeclaration = true _
}
Using xmlWriter = System.Xml.XmlWriter.Create(textWriter, settings)
node.WriteTo(xmlWriter)
End Using
Return textWriter.ToString()
End Using
End Function
End Module