XML反序列化基于元素标记设置值
我怀疑这是否可能,但我很好奇。是否可以反序列化xml,使元素的标记名用于填充属性值?例如,给定以下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
<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