【问题标题】:Serialize xml with different ElementName to same object with VB.net or C#使用 VB.net 或 C# 将具有不同 ElementName 的 xml 序列化为相同的对象
【发布时间】:2013-11-28 16:35:44
【问题描述】:
我可以收到不同语言的 xml 跟踪,例如这些示例:
<Persona>
<Nombre>Josep</Nombre>
<Edad>26</Edad>
</Persona>
<Person>
<Name>Josep</Name>
<Age>26</Age>
</Person>
而且我需要使用 VB.net 或 C# 序列化成同一个对象。
我这样声明对象:
Public Class Person
<XmlElement(ElementName:="Nombre">
Public n_nombre As String
<XmlElement(ElementName:="Edad")>
Public n_edad As String
End Class
我如何声明它以承认它?有可能吗?
谢谢!
【问题讨论】:
标签:
xml
vb.net
serialization
xml-serialization
xmlserializer
【解决方案1】:
使用实现相同接口的模型。具体模型可以指定语言对应的xml元素名称:
<XmlRoot("Persona")> _
Public Class Person_Es
Implements IXMLPerson
<XmlElement("Edad")> _
Public Property Age As Long Implements IXMLPerson.Age
<XmlElement("Nombre")> _
Public Property Name As String Implements IXMLPerson.Name
Public Sub New()
End Sub
End Class
<XmlRoot("Person")> _
Public Class Person_En
Implements IXMLPerson
<XmlElement("Age")> _
Public Property Age As Long Implements IXMLPerson.Age
<XmlElement("Name")> _
Public Property Name As String Implements IXMLPerson.Name
Public Sub New()
End Sub
End Class
Public Interface IXMLPerson
Property Name As String
Property Age As Long
End Interface
并且要将xml加载到内存中,只有正确的语言会序列化,所以我使用了嵌套Try。如果您有多种语言,您可能希望更好地构建它以减少和重用代码。这适用于英语和西班牙语:
Dim filename As String = "<your file name here>"
Dim myPerson As IXMLPerson = Nothing
Try
Dim serializer As New XmlSerializer(GetType(Person_Es))
Using sr As New StreamReader(filename)
myPerson = CType(serializer.Deserialize(sr), Person_Es)
End Using
Catch ex1 As Exception
Try
Dim serializer As New XmlSerializer(GetType(Person_En))
Using sr As New StreamReader(filename)
myPerson = CType(serializer.Deserialize(sr), Person_En)
End Using
Catch ex As Exception
MessageBox.Show("Exception: " & ex.Message)
End Try
End Try