【问题标题】:How do you get an attribute from a node in a nodelist?如何从节点列表中的节点获取属性?
【发布时间】:2014-01-10 15:05:44
【问题描述】:

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

我有一个由 XML 文件填充的 ListBox。 我设法让“全部删除”工作,但我无法让“删除单曲”工作。不确定如何从节点列表中的节点获取属性值。 我需要将 Bookmark Elements 的 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

【问题讨论】:

    标签: xml vb.net nodes xmlnode nodelist


    【解决方案1】:

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

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

    或者,您可以使用XDocumentXElement 类使用LINQ to XML 找到它,如下所示:

    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 对象中查找节点。

    【讨论】:

    • 非常感谢。我能够使用您的第一个示例来完全满足我的需要。然后我能够遍历节点列表,然后执行 node.RemoveChild(theNode)。
    猜你喜欢
    • 1970-01-01
    • 2022-07-01
    • 2010-11-08
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2015-11-10
    相关资源
    最近更新 更多