从 XML 文件中查找数据
LookUp data from XML File
我有一个 xml 文件,其中包含这样设置的客户端列表:
<?xml version="1.0" encoding="utf-8"?>
<Clients>
<Client>
<Number>10001</Number>
<Name>Apple</Name>
</Client>
<Client>
<Number>20002</Number>
<Name>Microsoft</Name>
</Client>
</Clients>
我有一个用户表单,其中有 2 个文本框,一个用于客户编号,另一个用于客户名称,当用户输入客户编号时,第二个文本框应填充 xml 中的客户名称文件。我无法让它工作,我尝试使用以下代码(其中变量 'numbers' 是从客户端号码文本框中提取的):
doc.Load("C:\Users\Me\ClientList.xml")
Dim acc As String = doc.SelectSingleNode("/Clients/Client/Name=" & numbers).InnerText
Form.txtClientName.Text = acc
使用 XElement 和 LINQ。您应该能够适应您的需求。
Dim xe As XElement
' xe = XElement.Load("path here")
' or use literal for testing
xe = <Clients>
<Client>
<Number>10001</Number>
<Name>Apple</Name>
</Client>
<Client>
<Number>20002</Number>
<Name>Microsoft</Name>
</Client>
</Clients>
'select a client by number
Dim selC As XElement = (From el In xe...<Number> Where el.Value = "10001" Select el.Parent Take 1).FirstOrDefault
Dim nm As String
Dim num As String
'get data from selection
If selC IsNot Nothing Then
nm = selC.<Name>.FirstOrDefault.Value
num = selC.<Number>.FirstOrDefault.Value
End If
您想要一个节点,该节点是特定节点的兄弟节点。参考this answer,可以用
Dim acc As String = doc.SelectSingleNode("/Clients/Client[Number='" & numbers & "']/Name").InnerText
(我认为“numbers”不是一个只包含一个值的变量的好名字。)
使用Xml序列化
创建 类 来定义您的数据
<XmlRoot>
Public Class Clients
<XmlElement("Client")>
Public Property Clients As List(Of Client)
End Class
Public Class Client
<XmlElement>
Public Property Number As Integer
<XmlElement>
Public Property Name As String
End Class
反序列化文件一次,并使用 LINQ
在 TextBox_TextChanged 中检查匹配的客户端
Private myClients As Clients
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim serializer As New Xml.Serialization.XmlSerializer(GetType(Clients))
Using sr As New System.IO.StreamReader("C:\Users\Me\ClientList.xml")
myClients = serializer.Deserialize(sr)
End Using
End Sub
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim number As Integer
If Integer.TryParse(TextBox1.Text, number) Then
Dim matchingClient = myClients?.Clients?.FirstOrDefault(Function(c) c.Number = number)
If matchingClient IsNot Nothing Then
TextBox2.Text = matchingClient.Name
End If
End If
End Sub
现在您有了强类型对象,您可以使用它做更多事情,而不是使用 XDocuments 和 XElements
我有一个 xml 文件,其中包含这样设置的客户端列表:
<?xml version="1.0" encoding="utf-8"?>
<Clients>
<Client>
<Number>10001</Number>
<Name>Apple</Name>
</Client>
<Client>
<Number>20002</Number>
<Name>Microsoft</Name>
</Client>
</Clients>
我有一个用户表单,其中有 2 个文本框,一个用于客户编号,另一个用于客户名称,当用户输入客户编号时,第二个文本框应填充 xml 中的客户名称文件。我无法让它工作,我尝试使用以下代码(其中变量 'numbers' 是从客户端号码文本框中提取的):
doc.Load("C:\Users\Me\ClientList.xml")
Dim acc As String = doc.SelectSingleNode("/Clients/Client/Name=" & numbers).InnerText
Form.txtClientName.Text = acc
使用 XElement 和 LINQ。您应该能够适应您的需求。
Dim xe As XElement
' xe = XElement.Load("path here")
' or use literal for testing
xe = <Clients>
<Client>
<Number>10001</Number>
<Name>Apple</Name>
</Client>
<Client>
<Number>20002</Number>
<Name>Microsoft</Name>
</Client>
</Clients>
'select a client by number
Dim selC As XElement = (From el In xe...<Number> Where el.Value = "10001" Select el.Parent Take 1).FirstOrDefault
Dim nm As String
Dim num As String
'get data from selection
If selC IsNot Nothing Then
nm = selC.<Name>.FirstOrDefault.Value
num = selC.<Number>.FirstOrDefault.Value
End If
您想要一个节点,该节点是特定节点的兄弟节点。参考this answer,可以用
Dim acc As String = doc.SelectSingleNode("/Clients/Client[Number='" & numbers & "']/Name").InnerText
(我认为“numbers”不是一个只包含一个值的变量的好名字。)
使用Xml序列化
创建 类 来定义您的数据
<XmlRoot>
Public Class Clients
<XmlElement("Client")>
Public Property Clients As List(Of Client)
End Class
Public Class Client
<XmlElement>
Public Property Number As Integer
<XmlElement>
Public Property Name As String
End Class
反序列化文件一次,并使用 LINQ
在 TextBox_TextChanged 中检查匹配的客户端Private myClients As Clients
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim serializer As New Xml.Serialization.XmlSerializer(GetType(Clients))
Using sr As New System.IO.StreamReader("C:\Users\Me\ClientList.xml")
myClients = serializer.Deserialize(sr)
End Using
End Sub
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim number As Integer
If Integer.TryParse(TextBox1.Text, number) Then
Dim matchingClient = myClients?.Clients?.FirstOrDefault(Function(c) c.Number = number)
If matchingClient IsNot Nothing Then
TextBox2.Text = matchingClient.Name
End If
End If
End Sub
现在您有了强类型对象,您可以使用它做更多事情,而不是使用 XDocuments 和 XElements