我是Visual Studio 2015(VB)的XML初学者。反序列化将适用于valueA和valueB。但帐户是空的。我不明白这个问题。我能做什么?或者,对这个XML文件进行反序列化的正确方法是什么?如何在vb中访问var?感谢名单!!!
我已关注XML文件:
<?xml version="1.0" encoding="utf-16"?>
<clsSettings>
<valueA>20</valueA>
<valueB>5</valueB>
<Accounts>
<Account>
<User>tralala</User>
<Pw>tralala</Pw>
</Account>
<Account>
<User>triliki</User>
<Pw>trierer</Pw>
</Account>
</Accounts>
</clsSettings>
这是我的班级:
Public Class clsSettings
Public valueA As String
Public valueB As String
Public MyAccounts As Accounts
End Class
Public Class Accounts
Public MyAccount As List(Of Account)
End Class
Public Class Account
Public User As String
Public Pw As String
End Class
她就是代码:
Dim objSerializer As XmlSerializer
Dim objStream As System.IO.FileStream
If My.Computer.FileSystem.FileExists("settings.xml") Then
objStream = New System.IO.FileStream("settings.xml", IO.FileMode.Open)
objSerializer = New XmlSerializer(GetType(clsSettings))
Try
Settings = CType(objSerializer.Deserialize(objStream), clsSettings)
readSettings()
Catch ex As InvalidOperationException
SetText(txt_status, "XML ERROR " + ex.Message)
Catch ex As SerializationException
SetText(txt_status, "XML ERROR " + ex.Message)
Catch ex As IOException
SetText(txt_status, "XML IO ERROR " + ex.Message)
Finally
objStream.Close()
End Try
end if
答案 0 :(得分:1)
如果您在XML中使用Visual Studio并选择&#34;编辑&#34;您可以让Visual Studio为您的XML创建类。 - &GT; &#34;粘贴特殊&#34; - &GT; &#34;将XML粘贴为类&#34;。我在一个新的类文件中做到了
'''<remarks/>
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True),
System.Xml.Serialization.XmlRootAttribute([Namespace]:="", IsNullable:=False)>
Partial Public Class clsSettings
Private valueAField As Byte
Private valueBField As Byte
Private accountsField() As clsSettingsAccount
'''<remarks/>
Public Property valueA() As Byte
Get
Return Me.valueAField
End Get
Set
Me.valueAField = Value
End Set
End Property
'''<remarks/>
Public Property valueB() As Byte
Get
Return Me.valueBField
End Get
Set
Me.valueBField = Value
End Set
End Property
'''<remarks/>
<System.Xml.Serialization.XmlArrayItemAttribute("Account", IsNullable:=False)>
Public Property Accounts() As clsSettingsAccount()
Get
Return Me.accountsField
End Get
Set
Me.accountsField = Value
End Set
End Property
End Class
'''<remarks/>
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)>
Partial Public Class clsSettingsAccount
Private userField As String
Private pwField As String
'''<remarks/>
Public Property User() As String
Get
Return Me.userField
End Get
Set
Me.userField = Value
End Set
End Property
'''<remarks/>
Public Property Pw() As String
Get
Return Me.pwField
End Get
Set
Me.pwField = Value
End Set
End Property
End Class
请注意,它使用最小尺寸的数据类型来存储它在粘贴中看到的内容,例如&#34; ValueA&#34;已设置为Byte
类型。你可能想要改变这些。
接下来,我注意到你的XML声明包括&#34; encoding =&#34; utf-16&#34;&#34;,所以我用这个编码小心地保存了你的示例数据(使用little-endian并包括BOM)。我没试过就试过了,我收到了一个错误&#34; XML文档中存在错误(0,0)&#34;。
完成所有设置后,我使用了一个简单的控制台应用程序:
Imports System.Xml.Serialization
Module Module1
Sub X(src As String)
Dim objSerializer As XmlSerializer
Dim settings As New clsSettings
If My.Computer.FileSystem.FileExists(src) Then
Using objStream As New System.IO.FileStream(src, IO.FileMode.Open)
objSerializer = New XmlSerializer(GetType(clsSettings))
settings = DirectCast(objSerializer.Deserialize(objStream), clsSettings)
End Using
End If
For Each el In settings.Accounts
Console.WriteLine($"{el.User} {el.Pw}")
Next
End Sub
Public Sub Main()
Dim src = "C:\temp\SodahSample.xml"
X(src)
Console.ReadLine()
End Sub
End Module
获取输出
tralala tralala
triliki trierer
因此,有两件事需要确定:首先,您的文件编码与XML声明中的内容匹配,其次,您声明的类符合XML文档中的内容。您可能会发现使用XSD file有帮助。
答案 1 :(得分:0)
您的课程与您的XML不匹配...试试这个:
Public Class clsSettings
<DefaultValue("")>
Public Property valueA() As String
<DefaultValue("")>
Public Property valueB() As String
<XmlArrayItem("Account")>
Public Property Accounts() As New List(Of Account)
End Class
Public Class Account
<DefaultValue("")>
Public Property User() As String
<DefaultValue("")>
Public Property Pw() As String
End Class