XML反序列化基于元素标记设置值

XML反序列化基于元素标记设置值,xml,vb.net,serialization,Xml,Vb.net,Serialization,我怀疑这是否可能,但我很好奇。是否可以反序列化xml,使元素的标记名用于填充属性值?例如,给定以下xml: <Test> <List> <Jake Type="Dog" /> <Mittens Type="Cat" /> </List> </Test> 因此,不是使用Xml序列化程序,而是可以通过以下方式使用XmlReader(XmlTextReader)解决此问题: Cla

我怀疑这是否可能,但我很好奇。是否可以反序列化xml,使元素的标记名用于填充属性值?例如,给定以下xml:

<Test>
    <List>
        <Jake Type="Dog" />
        <Mittens Type="Cat" />
    </List>
</Test>

因此,不是使用Xml序列化程序,而是可以通过以下方式使用XmlReader(XmlTextReader)解决此问题:

Class Animal
    Public Property Name As String
    Public Property Type As String
End Class

Function ReadDocument(filename As String) As List(Of Animal)
    Dim lst As New List(Of Animal)

    Dim doc As XmlReader

    Using fs As FileStream = New FileStream(filename, FileMode.Open, FileAccess.Read)
        doc = New Xml.XmlTextReader(fs)
        While doc.Read()
            If doc.NodeType <> XmlNodeType.Element Then
                Continue While
            End If
            If Not String.Equals(doc.Name, "List") Then
                Continue While
            End If
            While doc.Read()
                If doc.NodeType = XmlNodeType.EndElement And String.Equals(doc.Name, "List") Then
                    Exit While
                End If
                If doc.NodeType <> XmlNodeType.Element Then
                    Continue While
                End If
                Dim ani As New Animal
                ani.Name = doc.Name
                If doc.MoveToAttribute("Type") Then
                    ani.Type = doc.Value
                    lst.Add(ani)
                End If
            End While
        End While
    End Using

    Return lst
End Function

Sub Main()
    Dim animals As List(Of Animal) = ReadDocument("./Animals.xml")
    Console.WriteLine("{0}{1}{2}", "Name", vbTab, "Type")
    For Each ani As Animal In animals
        Console.WriteLine("{0}{1}{2}", ani.Name, vbTab, ani.Type)
    Next
    Console.ReadLine()
End Sub
类动物
作为字符串的公共属性名称
公共属性类型为字符串
末级
函数ReadDocument(文件名为字符串)作为列表(动物)
Dim lst作为新列表(动物)
Dim doc作为XmlReader
将fs用作FileStream=新FileStream(文件名,FileMode.Open,FileAccess.Read)
doc=新的Xml.XmlTextReader(fs)
而doc.Read()
如果doc.NodeType XmlNodeType.Element,则
继续
如果结束
如果不是String.Equals(doc.Name,“List”),则
继续
如果结束
而doc.Read()
如果doc.NodeType=XmlNodeType.EndElement和String.Equals(doc.Name,“List”),则
退出时
如果结束
如果doc.NodeType XmlNodeType.Element,则
继续
如果结束
新动物
ani.Name=文件名
如果文档移动到属性(“类型”),则
ani.Type=单据值
第一次增补(ani)
如果结束
结束时
结束时
终端使用
返回lst
端函数
副标题()
将动物作为列表(动物)=ReadDocument(“./anists.xml”)
WriteLine(“{0}{1}{2}”,“名称”,vbTab,“类型”)
对于每个ani,将其视为动物中的动物
Console.WriteLine(“{0}{1}{2}”,ani.Name,vbTab,ani.Type)
下一个
Console.ReadLine()
端接头

XmlSerializer类不适用,但是,您可以使用XmlDocumentReader来实现。如果我要使用它,我想我只需要编写一个自定义序列化接口。是的,它也可以适应您的需要,只是使用起来要复杂得多,如果您真的想/需要它更通用,然后自定义属性可以进一步帮助您。。。
Class Animal
    Public Property Name As String
    Public Property Type As String
End Class

Function ReadDocument(filename As String) As List(Of Animal)
    Dim lst As New List(Of Animal)

    Dim doc As XmlReader

    Using fs As FileStream = New FileStream(filename, FileMode.Open, FileAccess.Read)
        doc = New Xml.XmlTextReader(fs)
        While doc.Read()
            If doc.NodeType <> XmlNodeType.Element Then
                Continue While
            End If
            If Not String.Equals(doc.Name, "List") Then
                Continue While
            End If
            While doc.Read()
                If doc.NodeType = XmlNodeType.EndElement And String.Equals(doc.Name, "List") Then
                    Exit While
                End If
                If doc.NodeType <> XmlNodeType.Element Then
                    Continue While
                End If
                Dim ani As New Animal
                ani.Name = doc.Name
                If doc.MoveToAttribute("Type") Then
                    ani.Type = doc.Value
                    lst.Add(ani)
                End If
            End While
        End While
    End Using

    Return lst
End Function

Sub Main()
    Dim animals As List(Of Animal) = ReadDocument("./Animals.xml")
    Console.WriteLine("{0}{1}{2}", "Name", vbTab, "Type")
    For Each ani As Animal In animals
        Console.WriteLine("{0}{1}{2}", ani.Name, vbTab, ani.Type)
    Next
    Console.ReadLine()
End Sub