【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多