从 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