如何从节点列表中的节点获取属性?

时间:2014-01-10 15:05:44

标签: xml vb.net nodes xmlnode nodelist

我正在使用Visual Studio 2010并在VB中编码。

我有一个由XML文件填充的ListBox。 我设法让“全部删除”工作,但我无法让“删除单一”工作。不确定如何从节点列表中的节点获取属性值。 我需要将书签元素的title属性与lstBookmarks.Text匹配,后者保存列表框所选项目的文本。

突出显示删除需要发生的位置(至少对我的代码而言)。 只要有解释,我很乐意接受完全重写的代码。

我的XML看起来像这样

<Data>
    <Bookmark title="Page 1" link="Some File Path Here" />
    <Bookmark title="Page 2" link="Some Other File Path Here" />
</Data>

我的删除看起来像这样

Private Sub DeleteToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles DeleteToolStripMenuItem.Click

        If lstBookmarks.SelectedIndex = -1 Then
            MessageBox.Show("There are no bookmarks to clear!")
        ElseIf lstBookmarks.SelectedValue.ToString() = "" Then
            MessageBox.Show("There are no bookmarks to clear!")
        Else
            Dim xmlFile As String = filePath & "Resources\bookmark.xml"
            Dim XMLDoc As XmlDocument = New XmlDocument
            Dim nodes As XmlNodeList

            XMLDoc.Load(xmlFile)
            nodes = XMLDoc.SelectNodes("Data")

            Dim RootElement As XElement = XElement.Load(xmlFile)
            Dim DataElement As XmlElement = XMLDoc.DocumentElement
            Dim NewElement As XmlElement = XMLDoc.CreateElement("Bookmark")
            Dim FindElement = RootElement.<Bookmark>.Attributes("title")

            If DataElement.HasChildNodes Then
                For Each Attribute In FindElement
                    If Attribute = lstBookmarks.Text Then
                        '************************************************
                        'Match found, delete node or XML Element here
                        '************************************************
                    Else
                        'No Match in XML, no need to delete
                    End If
                Next
            End If
        End If
    End Sub

1 个答案:

答案 0 :(得分:1)

要使用XmlDocument类查找元素,您可以使用XPath轻松完成,如下所示:

Dim xPath As String = String.Format("/Data/Bookmark[@title='{0}']", lstBookmarks.Text)
Dim theNode As XmlNode = XMLDoc.SelectSingleNode(xPath)

或者,您可以使用LINQ to XML使用XDocumentXElement类来查找它:

Dim theElement As XElement = RootElement.<Bookmark>.First(Function(x) x.@title = lstBookmarks.Text)

或者:

Dim theElement As XElement = (From i As XElement 
                              In RootElement.<Bookmark> 
                              Where i.@title = lstBookmarks.Text 
                              Select i).First()

您也可以使用XPath查找XDocument / XElement个对象中的节点。