Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按其同级查找XML元素_Xml_Vb.net_Siblings - Fatal编程技术网

按其同级查找XML元素

按其同级查找XML元素,xml,vb.net,siblings,Xml,Vb.net,Siblings,如何使用Visual Basic查找XML元素的同级?假设我有: <Data> <Mail> <Subject>Welcome!</Subject> <From>Antonios</From> <Content>Welcome! How can I assist you?</Content> </Mail> <Mail> <Su

如何使用Visual Basic查找XML元素的同级?假设我有:

<Data>
  <Mail>
    <Subject>Welcome!</Subject>
    <From>Antonios</From>
    <Content>Welcome! How can I assist you?</Content>
  </Mail>
  <Mail>
    <Subject>Test!</Subject>
    <From>John</From>
    <Content>Hello Friend!</Content>
  </Mail>
</Data>

欢迎
安东尼奥斯
欢迎我能帮你什么忙?
测试!
约翰
你好,朋友!
现在我有一个列表框,可以添加每个主题,所以列表显示:欢迎!和测试! 现在我想知道,当我点击“欢迎!”时,一个文本框显示“欢迎!”元素的内容,另一个文本框显示“欢迎”元素的“内容”
换句话说,我正在寻找一个特定元素的兄弟

您可以通过多种方式来实现这一点。以下是如何使用
XmlDocument
和XPath实现此功能:

Dim doc As New XmlDocument()
Dim From As String = doc.SelectSingleNode("/Data/Mail[Subject='Welcome!']/From").InnerText
Dim Content As String = doc.SelectSingleNode("/Data/Mail[Subject='Welcome!']/Content").InnerText
显然,由于主题可能不是唯一的,所以最好使用唯一ID的元素,或者可以通过索引来实现。例如,这将从第一封邮件中选择:

Dim From As String = doc.SelectSingleNode("/Data/Mail[1]/From").InnerText
但是,这样做的最好方法是将所有需要的数据预先加载到内存中。除非数据量太大(听起来不像),否则这通常是最有意义的。因此,例如,我建议创建一个表示邮件消息的数据对象,例如:

Public Class Mail
    Public Property Subject() As String
        Get
            Return _subject
        End Get
        Set(ByVal value As String)
            _subject = value
        End Set
    End Property
    Private _subject As String

    Public Property From() As String
        Get
            Return _from
        End Get
        Set(ByVal value As String)
            _from = value
        End Set
    End Property
    Private _from As String

    Public Property Content() As String
        Get
            Return _content
        End Get
        Set(ByVal value As String)
            _content = value
        End Set
    End Property
    Private _content As String

    Public Overrides Function ToString() As String
        Return _subject
    End Function
End Class
Dim doc As New XmlDocument()
For Each node As XmlNode In doc.SelectNodes("/Data/Mail")
    Dim mail As New Mail()
    mail.Subject = node.SelectSingleNode("Subject").InnerText
    mail.From = node.SelectSingleNode("From").InnerText
    mail.Content = node.SelectSingleNode("Content").InnerText
    ListBox1.Items.Add(mail)
Next
Dim mail As Mail = CType(ListBox1.SelectedItem, Mail)
Label1.Text = mail.From
Label2.Text = mail.Content
然后,可以为XML中的每个邮件元素加载一个
Mail
对象。由于
ToString
方法被覆盖以显示主题,因此您可以直接将对象添加到列表框中,例如:

Public Class Mail
    Public Property Subject() As String
        Get
            Return _subject
        End Get
        Set(ByVal value As String)
            _subject = value
        End Set
    End Property
    Private _subject As String

    Public Property From() As String
        Get
            Return _from
        End Get
        Set(ByVal value As String)
            _from = value
        End Set
    End Property
    Private _from As String

    Public Property Content() As String
        Get
            Return _content
        End Get
        Set(ByVal value As String)
            _content = value
        End Set
    End Property
    Private _content As String

    Public Overrides Function ToString() As String
        Return _subject
    End Function
End Class
Dim doc As New XmlDocument()
For Each node As XmlNode In doc.SelectNodes("/Data/Mail")
    Dim mail As New Mail()
    mail.Subject = node.SelectSingleNode("Subject").InnerText
    mail.From = node.SelectSingleNode("From").InnerText
    mail.Content = node.SelectSingleNode("Content").InnerText
    ListBox1.Items.Add(mail)
Next
Dim mail As Mail = CType(ListBox1.SelectedItem, Mail)
Label1.Text = mail.From
Label2.Text = mail.Content
然后,当选择列表框中的项目时,您可以将所选项目强制转换为
邮件类型并访问其属性,例如:

Public Class Mail
    Public Property Subject() As String
        Get
            Return _subject
        End Get
        Set(ByVal value As String)
            _subject = value
        End Set
    End Property
    Private _subject As String

    Public Property From() As String
        Get
            Return _from
        End Get
        Set(ByVal value As String)
            _from = value
        End Set
    End Property
    Private _from As String

    Public Property Content() As String
        Get
            Return _content
        End Get
        Set(ByVal value As String)
            _content = value
        End Set
    End Property
    Private _content As String

    Public Overrides Function ToString() As String
        Return _subject
    End Function
End Class
Dim doc As New XmlDocument()
For Each node As XmlNode In doc.SelectNodes("/Data/Mail")
    Dim mail As New Mail()
    mail.Subject = node.SelectSingleNode("Subject").InnerText
    mail.From = node.SelectSingleNode("From").InnerText
    mail.Content = node.SelectSingleNode("Content").InnerText
    ListBox1.Items.Add(mail)
Next
Dim mail As Mail = CType(ListBox1.SelectedItem, Mail)
Label1.Text = mail.From
Label2.Text = mail.Content
但是,此时,如果数据不是太大,则更容易使用
XmlSerializer
将XML反序列化为对象,例如,首先创建一个定义整个XML文档的类,如下所示:

Public Class Data
    <XmlElement("Mail")> _
    Public Property Mails() As List(Of Mail)
        Get
            Return _mails
        End Get
        Set(ByVal value As List(Of Mail))
            _mails = value
        End Set
    End Property
    Private _mails As List(Of Mail)
End Class
Dim node As XmlNode = doc.SelectSingleNode("/Data/Mail[Subject='Welcome!']")
node.ParentNode.RemoveChild(node)
或者,如果您希望直接从XML文件中读取,而不是从字符串中反序列化它:

Dim serializer As New XmlSerializer(GetType(Data))
Using stream As New FileStream("Test.xml", FileMode.Open)
    Dim data As Data = CType(serializer.Deserialize(stream), Data)
    ListBox1.Items.AddRange(data.Mails.ToArray())
End Using
要回答您在下面的评论中提出的第二个问题,要删除给定的邮件,您可以这样做:

Public Class Data
    <XmlElement("Mail")> _
    Public Property Mails() As List(Of Mail)
        Get
            Return _mails
        End Get
        Set(ByVal value As List(Of Mail))
            _mails = value
        End Set
    End Property
    Private _mails As List(Of Mail)
End Class
Dim node As XmlNode = doc.SelectSingleNode("/Data/Mail[Subject='Welcome!']")
node.ParentNode.RemoveChild(node)

非常感谢。正是我要找的!你也知道(这样我就不必写新帖子了)我将如何删除某个有孩子的父母吗?@Antonios我更新了我的答案,也回答了你的第二个问题。不过,在将来,最好分别问每个问题。这对将来的其他人寻找同一问题的答案更有用,并且有助于你获得更多的声誉。